2016-06-11 3 views
0

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.

+2

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

+0

@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

Répondre

0

Je Réaffectation Hans Passant's comment above comme une réponse car il répond essentiellement plus de cette question.

« Non, la création d'un [app domaine] ne crée pas un fil Vous exécutez à l'état de le fil qui a fait 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 le [domaine d'application] pour prendre soin de cela, le code de création de threads et l'appel Application.Run() dans ce [domaine de l'application]. "