Использование 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.

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


c# com dll
person Victor Chekalin    schedule 16.03.2010    source источник


Ответы (1)


arrow_upward
3
arrow_downward

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

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

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