Lorsque je crée un Thread
, j'ai la possibilité de définir explicitement son état COM apartment avant de le démarrer. Par exemple:Comment puis-je définir l'état de l'appartement COM pour le code chargé avec `AppDomain.ExecuteAssembly`?
// using System.Threading;
var thread = new Thread(…);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Mais quand je crée un AppDomain
et charger du code dans, je ne semblent avoir aucun contrôle explicite sur la création de threads, donc je n'ai aucun moyen d'appeler SetApartmentState
:
// using System;
var pluginAppDomain = AppDomain.Create("PluginAppDomain");
pluginAppDomain.ExecuteAssembly(@"Plugin.dll");
Est-il possible de spécifier que le thread d'entrée/principal créé à l'intérieur d'un AppDomain
doit utiliser un état d'appartement COM spécifique?
Je sais que la méthode d'entrée principale de Plugin.dll
peut être marquée avec un attribut [STAThread]
ou [MTAThread]
; mais supposons que Plugin.dll
ne déclare pas explicitement ou ne définit pas l'état de l'appartement COM, et que je ne peux pas modifier Plugin.dll
.
Non, la création d'un domaine d'application ** ne crée pas de thread. Vous exécutez avec l'état du thread qui a effectué l'appel AppDomain.Create(). Ce qui n'est pas assez bon, vous ne pouvez pas respecter la promesse STA. Vous aurez besoin de plus de code dans l'appdomain pour prendre soin de cela, le code de création de threads et l'appel Application.Run() doit fonctionner dans ce domaine d'application. –
@Hans, merci pour votre commentaire utile. Dommage que tu ne l'aies pas affiché comme réponse. ;-) Une chose que je ne comprends pas complètement ici, pourquoi 'Application.Run'? N'est-ce pas Winforms-specific (que ma question n'était pas)? J'ai lu le blog MSDN de Chris Brumme sur le besoin des threads STA de faire du pompage de messages pour ne pas bloquer la finalisation des objets (ou sth .. le long de cette ligne) et je suppose que vous avez mentionné 'Application.Run' - mais est-ce une nécessité absolue? ? Existe-il des alternatives? – stakx