Я столкнулся со странным поведением при использовании com-компонента без регистрации. Вот что у меня есть:
- Com компонент. Я не знаю, для какой модели потоков она предназначена
так как у меня нет исходников, но это точно работает в STA.
- Манифест для этого ком-компонента (manifestA)
- c # приложение (wpf, vs2010, пользовательский интерфейс sta)
Следующий код используется для создания экземпляра сервера:
var t = new Thread(CreateServer) { Name = "Server", IsBackground = true };
t.SetApartmentState(ApartmentState.STA);
t.Start();
CreateServer выглядит следующим образом:
public static void CreateServer()
{
Service = new Service();
Service.Connect();
/* start message queue*/
Dispatcher.Run();
}
код в приложении wpf:
new Thread(() => { GetServer().DoStuff(); }.Start();
Поэтому, когда я запускаю приложение, методы com фактически запускаются в основном потоке STA и блокируют пользовательский интерфейс.
Теперь, если я установлю threadingModel = "Квартира" в манифесте, это ни на что не повлияет. Но если перекомпилировать приложение после изменения модели потоков, com-сервер начинает работать на выделенном потоке.
Я много искал, но не мог понять, почему это происходит. Почему manifestA влияет только на компиляцию?
Есть идеи?
Спасибо