簡體   English   中英

如何確定一個類是在控制台應用程序或wpf中實例化的?

[英]How to determine whether a class is instantiated within a console application or wpf?

我需要編寫一個圍繞第三方api的包裝器,它會使用消息泵,因此根據是否在UI線程(例如在wpf應用程序中)實例化包裝器(例如控制台應用程序),需要對其進行非常不同的處理)。

如果它不在UI線程上運行,那么我需要一個調度程序並實現我自己的消息泵。

為此,我需要知道包裝器是否在wpf應用程序中實例化。 僅確定實例化是否發生在UI線程上是不夠的(即使在wpf應用程序中,實例化包裝器的線程可能不是UI線程)。

有什么辦法我可以弄清楚我是在一個帶有消息泵或控制台應用程序的wpf或windows窗體環境中我必須實現自己的消息泵嗎?

謝謝

我認為你可能最好有三個獨立的包。

要使其自動選擇,您需要在包中引用WPF WinForms。 假設最壞情況下,你的包剛才我導入到我的控制台應用程序。 其他人可能會考慮將WinForms導入到最壞情況的WPF應用程序中,而另一組人可能會執行WinForms,因為他們無法訪問WPF(因此您只是將它們從完全使用您的程序包中刪除)。

如果沒有其他答案滿足您的需求 - 您可以使用反射來檢查Application.Current是否為null,而不直接引用WPF程序集(和WinForms一樣):

private static bool IsWpfApplication() {
    var type = Type.GetType("System.Windows.Application, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
    if (type == null)
        return false;
    var currentProp = type.GetProperty("Current", BindingFlags.Public | BindingFlags.Static);
    if (currentProp == null)
        return false;
    return currentProp.GetValue(null, new object[0]) != null;
}

請注意,即使在控制台應用程序中,這可能會將PresentationFramework dll加載到當前應用程序域中。 如果這對您來說是個問題 - 您可以通過檢查已在app域中加載的程序集來執行相同的操作:

private static bool IsWpfApplication2() {
    var wpfAsm = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(c => c.GetName().Name == "PresentationFramework"); 
    if (wpfAsm == null)
        return false;
    var type = wpfAsm.GetType("System.Windows.Application");
    if (type == null)
        return false;
    var currentProp = type.GetProperty("Current", BindingFlags.Public | BindingFlags.Static);
    if (currentProp == null)
        return false;
    return currentProp.GetValue(null, new object[0]) != null;
}

有什么辦法我可以弄清楚我是在一個帶有消息泵或控制台應用程序的wpf或windows窗體環境中我必須實現自己的消息泵嗎?

您可以檢查是否有可用的頂級窗口:

if (Process.GetCurrentProcess().MainWindowHandle != IntPtr.Zero)
    //WPF

如果WPF應用程序有一個主窗口, MainWindowHandle應該返回一個句柄。

您還應該能夠使用本機GetConsoleWindow函數來確定您是否在控制台應用程序的上下文中。

這可能有效:

public static void Main(string[] args)
{
    var application = Application.Current;
    Console.WriteLine($"Application is {(application == null ? "null": "not-null")}");
    Console.ReadKey();
}

需要引用PresentationFramework,並且根據Resharper,WindowsBase和System.Xaml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM