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