2010-03-16 3 views
3

Я писал DLL на C++, который будет использоваться в C#. DLL есть функция, где я называюИспользование DLL, использующего COM в C#

hres = CoInitializeEx(NULL, COINIT_MULTITHREADED); 

и следующий вызов

hres = CoInitializeSecurity(
     NULL, 
     -1,       // COM authentication 
     NULL,      // Authentication services 
     NULL,      // Reserved 
     RPC_C_AUTHN_LEVEL_PKT, // Default authentication 
     RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
     NULL,      // Authentication info 
     EOAC_NONE,     // Additional capabilities 
     NULL       // Reserved 
     ); 

Там не никакой ошибки тогда я пытался использовать эту DLL в C++. Но если я вызываю функцию из DLL через приложение C#, я вижу ошибку (80010106) Невозможно изменить режим потока после его установки. я изменил

hres = CoInitializeEx(NULL, COINIT_MULTITHREADED); 

в

hres = CoInitialize(NULL); 

После этого изменения ошибки появляется после CoInitializeSecurity:

(80010119) Security must be initialized before any 
          interfaces are marshalled or unmarshalled. It 
          cannot be changed once initialized. 

Как решить эти проблемы?

ответ

2

Вы можете удалить звонок из CoInitializeEx и CoInitializeSecurity из своей DLL. Они уже вызваны в поток - вот почему вы получаете эти ошибки.

Однако, если ваша DLL пытается инициализировать поток COM как многопоточную квартиру, а ваше приложение C# вызывает DLL в однопоточной квартире, тогда у вас может быть базовая несовместимость. Это зависит от того, была ли строка кода, которая указала COINIT_MULTITHREADED, преднамеренным выбором по причине этого, или просто что-то, что, казалось, работало в то время, когда оно было изначально написано.

+0

Спасибо. Пожалуйста, посмотрите [этот связанный вопрос] (http://stackoverflow.com/q/29385515/938668). Я не могу понять, где разместить эти вызовы в управляемом приложении. –

Смежные вопросы