2016-06-11 17 views
0

Wenn ich ein Thread erstelle, habe ich die Möglichkeit, seinen COM-Appartment-Status explizit festzulegen, bevor ich es starte. Zum Beispiel:Wie kann ich den COM-Appliance-Status für Code festlegen, der mit 'AppDomain.ExecuteAssembly' geladen wurde?

// using System.Threading; 
var thread = new Thread(…); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

Aber wenn ich einen AppDomain und laden einige Code in es schaffen, scheine ich keine explizite Kontrolle über Thread-Erzeugung zu haben, also ich habe keine Möglichkeit SetApartmentState zu nennen:

// using System; 
var pluginAppDomain = AppDomain.Create("PluginAppDomain"); 
pluginAppDomain.ExecuteAssembly(@"Plugin.dll"); 

Gibt es eine Möglichkeit anzugeben, dass der Haupt-/Eintragsthread, der in einem AppDomain erstellt wurde, einen bestimmten COM-Appartment-Status verwenden soll?

Ich weiß, dass Plugin.dll Haupteintragsmethode mit einem [STAThread] oder [MTAThread] Attribut gekennzeichnet werden konnte; aber nehmen wir an, dass Plugin.dll den COM-Appartment-Status nicht explizit deklariert oder setzt und dass ich Plugin.dll nicht ändern kann.

+2

Nein, das Erstellen einer AppDomain erstellt ** nicht ** einen Thread. Sie führen den Status des Threads aus, mit dem der Aufruf von AppDomain.Create() ausgeführt wurde. Was nicht gut genug ist, kann man das Versprechen der STA nicht halten. Sie benötigen mehr Code in der appdomain, um sich darum kümmern zu können. Der Thread-Erstellungscode und der Aufruf von Application.Run() müssen in dieser App-Domäne funktionieren. –

+0

@Hans, danke für deinen hilfreichen Kommentar. Schade, dass du es nicht als Antwort gepostet hast. ;-) Eine Sache, die ich hier nicht ganz verstehe, warum 'Application.Run'? Ist das nicht Winforms-spezifisch (was meine Frage nicht war)? Ich habe Chris Brummes MSDN-Blog über die Notwendigkeit von STA-Threads gelesen, um Nachrichten pumpen zu können, um die Finalisierung von Objekten nicht zu blockieren (oder etw. In dieser Zeile), und deshalb haben Sie 'Application.Run' erwähnt - aber es ist eine absolute Notwendigkeit ? Gibt es Alternativen? – stakx

Antwort

0

Ich Hans Passant's comment above als Antwort erneut veröffentlichen, da sie im Wesentlichen der meisten dieser Frage beantwortet.

„Nein, eine [Anwendungsdomäne] Erstellen erstellt keinen Thread Du Ausführung mit dem Zustand der Thread, der den Aufruf AppDomain.Create() gemacht hat, was nicht gut genug ist, können Sie das STA-Versprechen nicht einhalten. Sie benötigen mehr Code in der [app domain], um sich darum kümmern zu können, der Thread-Erstellungscode und der Application.Run()-Aufruf müssen funktionieren in dieser [App-Domäne]. "