Использование DLL, использующей COM в С#

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

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);

to

hres = CoInitialize(NULL);

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

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

Как решить эту беду?


person Victor Chekalin    schedule 16.03.2010    source источник


Ответы (1)


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

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

person Daniel Earwicker    schedule 16.03.2010
comment
Спасибо. Ознакомьтесь с этим связанным вопросом. Я не могу понять, куда поместить эти вызовы в управляемом приложении. - person Raheel Khan; 01.04.2015