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.
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. –
@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