如何为“AppDomain.ExecuteAssembly”加载的代码设置COM单元状态?

时间:2016-06-11 08:53:24

标签: c# .net appdomain apartments

当我创建Thread时,我可以选择在启动它之前明确设置其COM单元状态。例如:

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

但是当我创建一个AppDomain并加载一些代码时,我似乎没有明确控制线程创建,所以我无法调用SetApartmentState

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

有没有办法指定在AppDomain内创建的主/入口线程应该使用特定的COM单元状态?

我知道Plugin.dll的主要输入方法可以标有[STAThread][MTAThread]属性;但我们假设Plugin.dll未明确声明或设置COM公寓状态,并且我无法更改Plugin.dll

1 个答案:

答案 0 :(得分:0)

我重新发布Hans Passant's comment above作为答案,因为它基本上回答了大部分问题:

  

"不,创建[app域]不会创建线程。您正在执行进行AppDomain.Create()调用的线程的状态。哪个不够好,你不能坚持STA的承诺。您需要[app域名]中的更多代码来处理此问题,线程创建代码和Application.Run()调用需要在[app域]中运行。"