Wie kann festgestellt werden, ob eine Klasse in einer Konsolenanwendung oder wpf instanziiert ist?

8

Ich muss einen Wrapper um eine API von Drittanbietern schreiben, die Message Pumps durchsucht und daher sehr unterschiedlich gehandhabt werden muss, je nachdem, ob der Wrapper auf einem UI-Thread (z. B. innerhalb einer WPF-Anwendung) instanziiert wird oder nicht eine Konsolenanwendung).

Wenn es nicht auf einem UI-Thread ausgeführt wird, brauche ich einen Dispatcher und implementiere meine eigene Nachrichtenpumpe.

Zu diesem Zweck muss ich wissen, ob der Wrapper innerhalb einer wpf-Anwendung instanziiert wird oder nicht. Es reicht nicht aus, festzustellen, ob die Instanziierung auf einem UI-Thread stattfindet oder nicht (selbst in einer WPF-Anwendung ist der Thread, in dem der Wrapper instanziiert wird, möglicherweise nicht der UI-Thread).

Gibt es irgendeine Möglichkeit, herauszufinden, ob ich in einer wpf oder Windows-Form-Umgebung bin mit einer Nachrichtenpumpe oder einer Konsolenanwendung, wo ich meine eigene Nachrichtenpumpe implementieren muss?

Danke

    
Matt Wolf 18.12.2017, 14:50
quelle

4 Antworten

6

Wenn keine andere Antwort Ihren Anforderungen entspricht, können Sie mithilfe von reflection prüfen, ob Application.Current null ist oder nicht, ohne direkt auf WPF-Assemblies zu verweisen (und dasselbe gilt für WinForms):

%Vor%

Beachten Sie, dass dies möglicherweise PresentationFramework dll in die aktuelle App-Domäne lädt, selbst in der Konsolenanwendung. Wenn das ein Problem für Sie ist, können Sie das Gleiche tun, indem Sie bereits in der App-Domäne geladene Assemblys überprüfen:

%Vor%     
Evk 18.12.2017, 15:33
quelle
9

Ich denke, Sie könnten am besten drei separate Pakete haben.

Damit es automatisch ausgewählt wird, müssen Sie in Ihrem Paket Verweise auf beide WPF und WinForms haben. Unter der Annahme, dass es sich bei Worstcase handelt, hat mich Ihr Paket dazu veranlasst, beide in meine Konsolenanwendung zu importieren. Andere denken vielleicht daran, WinForms in einen WPF-Anwendungsfall zu importieren, und eine andere Gruppe von Benutzern könnte WinForms ausführen, weil sie nicht auf WPF zugreifen können (und deshalb schneiden Sie sie einfach aus, wenn Sie Ihr Paket verwenden).

    
nvoigt 18.12.2017 15:01
quelle
1
  

Gibt es irgendeine Möglichkeit, herauszufinden, ob ich in einer wpf oder Windows-Form-Umgebung bin mit einer Nachrichtenpumpe oder einer Konsolenanwendung, wo ich meine eigene Nachrichtenpumpe implementieren muss?

Sie können überprüfen, ob ein Fenster auf oberster Ebene verfügbar ist:

%Vor%

MainWindowHandle sollte ein Handle zurückgeben, sofern die WPF-Anwendung über ein Hauptfenster verfügt.

Sie sollten auch die systemeigene Funktion GetConsoleWindow verwenden können, um festzustellen, ob Sie es sind im Kontext einer Konsolenanwendung.

    
mm8 18.12.2017 15:08
quelle
0

Dies könnte funktionieren:

%Vor%

Erfordert Verweise auf PresentationFramework und, laut Resharper, WindowsBase und System.Xaml

    
Adam Brown 18.12.2017 14:57
quelle

Tags und Links