C# 在C中使用COM的DLL# 我已经用C++编写了DLL,这将在C语言中使用。 DLL有一些函数,我在那里调用 hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);

C# 在C中使用COM的DLL# 我已经用C++编写了DLL,这将在C语言中使用。 DLL有一些函数,我在那里调用 hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);,c#,com,dll,C#,Com,Dll,下一个电话呢 hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_

下一个电话呢

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
        );
没有错误,然后我尝试在C++中使用这个dll。但如果我通过C#应用程序从DLL调用函数,我会看到错误(80010106),设置后无法更改线程模式。我更改了

hres =  CoInitializeEx(NULL, COINIT_MULTITHREADED);

更改后,协同初始化安全性后出现错误:

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

如何解决此问题?

您可以从DLL中删除对
CoInitializeEx
CoInitializeSecurity
的调用。它们已经在线程上被调用了——这就是为什么会出现这些错误


但是,如果您的DLL试图将COM线程初始化为多线程单元,而您的C#应用程序正在单线程单元上调用DLL,则可能存在基本的不兼容性。这取决于指定的
COINIT\u multi-threaded
的代码行是经过深思熟虑的选择,背后是有原因的,还是在最初编写时似乎有效的代码行。

谢谢。请看一看。我无法在托管应用程序中找到这些呼叫的位置。
(80010119)    Security must be initialized before any
                          interfaces are marshalled or unmarshalled. It
                          cannot be changed once initialized.