Используя DLL, которая использует COM в C # - PullRequest
3 голосов
/ 16 марта 2010

Я пишу 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);

до

hres = CoInitialize(NULL);

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

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

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

1 Ответ

2 голосов
/ 16 марта 2010

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

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

...