기본 프로그램이 Windows 애플리케이션인지 콘솔 애플리케이션인지 확인
우리는 일반적으로 두 가지 유형의 데스크톱 애플리케이션이 있다는 것을 알고 있습니다. 하나는 Windows 애플리케이션이고 다른 하나는 콘솔 애플리케이션입니다.
Dll을 호출하는 기본 프로그램이 Windows인지 아니면 콘솔 응용 프로그램인지 확인하는 방법은 무엇입니까?
이 문제를 해결하기 위한 기본 포인트는 ApplicationBase, ConsoleApplicationBase, WindowsFormsApplicationBase이다.
공격 장소는 당연히 Application이다.
나도 Thread.CurrentContext, Thread.CurrentThread, AppDomain.CurrentDomain에서 시작할 수 있을까 고민했는데 살펴보진 않았다. 이제 저는 "당연히" 응용 프로그램을 생각합니다. 게다가 응용 프로그램은 System.Windows.Forms 공간에서 유래합니다. 이를 사용하여 ConsoleApplicationBase를 판단하는 것은 항상 약간 까다롭습니다.
내 테스트에 따르면 다음과 같이 기본 프로그램을 표현하는 세 가지 방법이 있습니다.
Public Enum ApplicationType
WindowsForms '이것은 Windows 애플리케이션입니다. Form에 의해 시작됨
ConsoleForms '이것은 Main에 의해 시작되고 Application.Run 코드를 포함하는 콘솔 응용 프로그램입니다(새 양식)
Console '이것은 Main에 의해 시작되는 콘솔 응용 프로그램입니다. Form.ShowDialog가 이 항목에도 나열되어 있더라도
End Enum
MyApplicationBase.vb
Microsoft.VisualBasic.ApplicationServices 가져오기
네임스페이스 LzmTW .uSystem.uForms
공용 클래스 MyApplicationBase
'System.Windows.Forms.Application+ThreadContext
비공개 공유 gThreadContextType As uReflection.TypeHelper
'Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase+WinFormsAppContext
개인 공유 gWinFormsAppContextType As uReflection.TypeHelper
개인 gAppContext As Object = Nothing 'ApplicationContext 또는 WinFormsAppContext
Private gWindowsFormsApplicationBase As WindowsFormsApplicationBase = Nothing
Private gCurrentType As ApplicationType
Shared Sub New()
gThreadContextType = New uReflection.TypeHelper(GetType(Application ), "ThreadContext ", True)
gWinFormsAppContextType = New uReflection.TypeHelper(GetType(WindowsFormsApplicationBase), "WinFormsAppContext", True)
End Sub
Sub New()
GetApplicationContext()
GetWindowsFormsApplicationBase()
gCurrentType = GetApplicationType()
End Sub
Private Sub GetApplicationContext ()
mCurrentThreadContext As Object
mCurrentThreadContext = gThreadContextType.MethodInvoke("FromCurrent")
gThreadContextType.SetC
urrentObj(mCurrentThreadContext)
gAppContext = gThreadContextType.GetMemberValue("ApplicationContext")
End Sub
Private Sub GetWindowsFormsApplicationBase()
If gWinFormsAppContextType.CurrentType.IsInstanceOfType(gAppContext)이 아니면 반환
gWinFormsAppContextType.SetCurrentObj(gAppContext)
gWindowsFormsApplicationBase = CType(gWinFormsAppContextType.GetMemberValue("m_App"), WindowsFormsApplicationBase)
End Sub
Private Function GetApplicationType() As ApplicationType
gAppContext가 아무것도 아닌 경우
ApplicationType.Console 반환
End If
If gWindowsFormsApplicationBase가 아무것도 아닌 경우
ApplicationType.ConsoleForms 반환
End If
ApplicationType.WindowsForms 반환
함수 종료
Public ReadOnly 속성 ApplicationContext() As ApplicationContext
Get
Return CType(gAppContext, ApplicationContext)
End Get
End 속성
공용 읽기 전용 속성 WindowsFormsApplicationBase() As WindowsFormsApplicationBase
Get
Return gWindowsFormsApplicationBase
End Get
End 속성
Public ReadOnly 속성 CurrentType() As ApplicationType
Get
Return gCurrentType
End Get
End 속성
Public Enum ApplicationType
WindowsForms
ConsoleForms
Console
End 열거형
클래스 종료
네임스페이스 종료
콘솔의 테스트:
공개 수업 프로그램
공유 하위 Main()
Console.WriteLine((New LzmTW.uSyste
m.uForms.MyApplicationBase).CurrentType.ToString)
Application.Run(새 Form1)
Console.WriteLine((New LzmTW.uSystem.uForms.MyApplicationBase).CurrentType.ToString )
Console.Read()
End Sub
End Class
그리고 Form1에도 테스트할 버튼이 있습니다
p >Private Sub ButtonTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)은 ButtonTest.Click을 처리합니다.
Console.WriteLine((New LzmTW.uSystem.uForms.MyApplicationBase).CurrentType . ToString)
End Sub
그런 다음 표시되는 결과는 Console 먼저, 그 다음 ConsoleForms, 마지막으로 Console입니다.
MyApplicationBase가 유용합니까?
물론 필요에 따라 다릅니다.
예를 들어 정보를 출력해야 하는 클래스가 있는 경우 콘솔 애플리케이션인 경우 WinForm 프로그램인 경우 다음과 같은 형식으로 출력됩니다.
이때 MyApplicationBase를 결정하는 데 필요합니다.
또한 WinForm 애플리케이션인 경우 MyApplicationBase.WindowsFormsApplicationBase는 실제로 My.Application입니다.