开发者

Using DLL that using COM in C#

I have been writing DLL on C++, that will be use in C#. DLL have some function, where I call

hres =  CoInitializeEx(NULL, COINIT_MULTITHREADED); 

and next call

hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                     开发者_StackOverflow社区   // 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
        );

There are no error then I trying to use this dll in C++. But if I call function from DLL via C# application I see Error (80010106) Cannot change thread mode after it is set. I changed

hres =  CoInitializeEx(NULL, COINIT_MULTITHREADED);

to

hres = CoInitialize(NULL);

After this changes error appear after CoInitializeSecurity:

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

How resolve this trouble?


You could remove the call to CoInitializeEx and CoInitializeSecurity from your DLL. They have already been called on the thread - that's why you get these errors.

However, if your DLL is trying to initialize a COM thread as a multithreaded apartment, and your C# application is calling the DLL on a single-threaded apartment, then you may have a basic incompatibility. It depends whether the line of code that specified COINIT_MULTITHREADED was a deliberate choice with a reason behind it, or just something that seemed to work at the time it was originally written.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜