COINIT_APARTMENTTHREADING не работает, в то время как MULTITHREADING работает из моего обернутого класса C # - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть класс C ++, который выполняет все, что мне нужно, и обертку для него, чтобы я мог получить к нему доступ через C #. Класс C ++ устанавливает тип потоков в APARTMENT THREADING, и когда я обращаюсь к нему из другого класса C ++, он работает нормально. Если я запускаю его через оболочку C #, он работает только в том случае, если для класса C ++ установлено многопоточность.

Я пытался настроить оболочку на запуск собственного потока квартиры перед вызовом класса C ++, но он не может успешно инициализировать поток. Когда я печатаю HRESULT, он говорит, что все успешно завершено.

Я не знаю, что мне здесь не хватает, и если кто-то может помочь, это будет оценено. Заранее спасибо! Для -Alex-

1 Ответ

1 голос
/ 07 февраля 2012

Да, не работает.Класс не может установить квартиру потока надежно, если он не создал поток.Что, конечно, не так, CLR создал поток.И уже вызвал CoInitializeEx (), выбранная квартира не может быть изменена позже.

Если для вашего кода C ++ требуется однопоточная квартира, то код C # должен помочь.Либо добавив атрибут [STAThread] в метод Main ().Или вызывая Thread.SetApartmentState (), когда он создает свой собственный поток для вызова вашего кода.Поток потока всегда является MTA, который не может быть изменен.

Между прочим, это вполне разумное ожидание, многие нативные коды имеют требования STA.Помните, что код C # должен также прокачать цикл сообщений, чтобы заставить STA работать.Об этом позаботятся, если вы создадите приложение Winforms или WPF.

...