2016-06-11 6 views
0

Когда я создаю Thread, я могу настроить его состояние COM-квартиры явно, прежде чем запускать его. Например:Как установить состояние COM-квартиры для кода, загруженного с помощью `AppDomain.ExecuteAssembly`?

// 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"); 

Есть ли способ указать, что поток main/entry, созданный внутри AppDomain, должен использовать определенное состояние COM-квартиры?

Я знаю, что метод основной записи Plugin.dll может быть помечен атрибутом [STAThread] или [MTAThread]; но предположим, что Plugin.dll явно не объявляет или не устанавливает состояние COM-квартиры, и что я не могу изменить Plugin.dll.

+2

Нет, создание appdomain делает ** не ** создавать поток. Выполняется с состоянием потока, вызвавшего вызов AppDomain.Create(). Что не достаточно хорошо, вы не можете отстаивать обещание STA. Вам потребуется больше кода в appdomain, чтобы позаботиться об этом, код создания потока и вызов Application.Run() должны работать в этом приложении. –

+0

@ Спасибо, спасибо за полезный комментарий. Жаль, что вы не опубликовали его в качестве ответа. ;-) Одна вещь, которую я не совсем понимаю здесь, почему «Application.Run»? Разве это не зависит от Winforms (чего у меня не было)? Я читал блог MSDN Криса Брумме о необходимости потоков STA для перекачки сообщений, чтобы не блокировать завершение объектов (или sth. Вдоль этой строки), и я полагаю, поэтому вы упомянули «Application.Run» - но это абсолютная необходимость ? Есть ли альтернативы? – stakx

ответ

0

Я повторно разместить Hans Passant's comment above как ответ, так как она по существу отвечает на большую часть этого вопроса:.

«Нет, создавая [домен приложения] не создает поток Вы выполняете с состоянием поток, который вызвал звонок AppDomain.Create().Это не достаточно хорошо, вы не можете отстаивать обещание STA. Чтобы позаботиться об этом, вам потребуется больше кода в [домене приложения], необходимо создать код создания потока и вызов Application.Run() в этом [домен приложения]. "