Red de conocimientos turísticos - Conocimientos sobre calendario chino - Determinar si el programa principal es una aplicación de Windows o una aplicación de consola

Determinar si el programa principal es una aplicación de Windows o una aplicación de consola

Sabemos que generalmente existen dos tipos de aplicaciones de escritorio, una es la aplicación de Windows y la otra es la aplicación de consola.

¿Cómo determinar si el programa principal que llama a tu DLL es Windows o una aplicación de consola?

Para resolver este problema, los puntos básicos son ApplicationBase, ConsoleApplicationBase y WindowsFormsApplicationBase.

El lugar del ataque es, por supuesto, la Aplicación.

También pensé si podría comenzar desde Thread.CurrentContext, Thread.CurrentThread, AppDomain.CurrentDomain, pero no lo miré. Ahora pienso en la Aplicación "por supuesto", que es un poco arbitraria. Además, la Aplicación se origina en el espacio System.Windows.Forms. Siempre resulta un poco complicado usarla para juzgar ConsoleApplicationBase.

Según mis propias pruebas, hay tres formas de expresar el programa principal, de la siguiente manera:

Tipo de aplicación de enumeración pública

WindowsForms 'Esta es una aplicación de Windows iniciada por Form

ConsoleForms 'Esta es una aplicación de consola iniciada por Main y que contiene el código Application.Run (New Form)

Console 'Esta es una aplicación de consola iniciada por Main sin un formulario, incluso si Form.ShowDialog también aparece en este elemento

End Enum

MyApplicationBase.vb

Importa Microsoft.VisualBasic.ApplicationServices

Espacio de nombres LzmTW .uSystem.uForms

Clase pública MyApplicationBase

'System.Windows.Forms.Application+ThreadContext

GThreadContextType privado compartido como uReflection.TypeHelper

'Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase+WinFormsAppContext

GWinFormsAppContextType privado compartido como uReflection.TypeHelper

GAppContext privado como objeto = Nada 'ApplicationContext o WinFormsAppContext

gWindowsFormsApplicationBase privado como WindowsFormsApplicationBase = Nada

gCurrentType privado como ApplicationType

Sub compartido New()

gThreadContextType = Nuevo uReflection.TypeHelper(GetType(Application ), "ThreadContext ", True)

gWinFormsAppContextType = New uReflection.TypeHelper(GetType(WindowsFormsApplicationBase), "WinFormsAppContext", True)

End Sub

Sub New()

GetApplicationContext()

GetWindowsFormsApplicationBase()

gCurrentType = GetApplicationType()

End Sub

Sub privado GetApplicationContext ()

Atenuar mCurrentThreadContext como objeto

mCurrentThreadContext = gThreadContextType.MethodInvoke("FromCurrent")

gThreadContextType.SetC

urrentObj(mCurrentThreadContext)

gAppContext = gThreadContextType.GetMemberValue("ApplicationContext")

End Sub

Sub privado GetWindowsFormsApplicationBase()

If No gWinFormsAppContextType.CurrentType.IsInstanceOfType(gAppContext) Luego regresa

gWinFormsAppContextType.SetCurrentObj(gAppContext)

gWindowsFormsApplicationBase = CType(gWinFormsAppContextType.GetMemberValue("m_App"), WindowsFormsApplicationBase)

End Sub

Función privada GetApplicationType() como ApplicationType

Si gAppContext no es nada, entonces

Devuelve ApplicationType.Console

End Si

Si gWindowsFormsApplicationBase no es nada, entonces

Devolver ApplicationType.ConsoleForms

Finalizar si

Devolver ApplicationType.WindowsForms

Finalizar función

Propiedad pública de solo lectura ApplicationContext() como ApplicationContext

Obtener

Devolver CType(gAppContext, ApplicationContext)

Fin de obtener

Propiedad final

Propiedad pública de solo lectura WindowsFormsApplicationBase() como WindowsFormsApplicationBase

Obtener

Devolver gWindowsFormsApplicationBase

Fin Obtener

Propiedad final

Propiedad pública de solo lectura CurrentType() como tipo de aplicación

Obtener

Devolver gCurrentType

Fin de obtención

Propiedad final

Tipo de aplicación de enumeración pública

WindowsForms

ConsoleForms

Consola

Fin Enum

End Class

End Namespace

Una prueba desde la consola:

Programa de clase pública

Compartido Sub Main()

Console.WriteLine((Nuevo LzmTW.uSyste

m.uForms.MyApplicationBase).CurrentType.ToString)

Application.Run(New Form1)

Console.WriteLine((New LzmTW.uSystem.uForms.MyApplicationBase).CurrentType.ToString )

Console.Read()

Finalizar sub

Finalizar clase

Y también hay un botón en Form1 para probar

Sub ButtonTest_Click privado(ByVal remitente como System.Object, ByVal e As System.EventArgs) maneja ButtonTest.Click

Console.WriteLine((New LzmTW.uSystem.uForms.MyApplicationBase).CurrentType . ToString)

End Sub

Luego, el resultado mostrado es primero Consola, luego ConsoleForms y finalmente Consola.

¿Es útil MyApplicationBase?

Por supuesto, depende de sus propias necesidades.

Por ejemplo, si hay una clase que necesita generar información, si es una aplicación de consola, se enviará a la consola. Si es un programa WinForm, se mostrará en el formulario. de un formulario.

Cuando llegue el momento, se necesita MyApplicationBase para determinar.

Además, si es una aplicación WinForm, MyApplicationBase.WindowsFormsApplicationBase es en realidad My.Application,