Несовместимость при вызове in-proc без регистрации com-сервера из c # - PullRequest
1 голос
/ 19 декабря 2011

Я столкнулся со странным поведением при использовании com-компонента без регистрации. Вот что у меня есть:

  1. Com компонент. Я не знаю, для какой модели потоков она предназначена так как у меня нет исходников, но это точно работает в STA.
  2. Манифест для этого ком-компонента (manifestA)
  3. 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 влияет только на компиляцию?

Есть идеи?

Спасибо

...