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 p >
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,