繁体   English   中英

使用在C#中使用COM的DLL

[英]Using DLL that using COM in C#

我一直在C ++上编写DLL,它将在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
        );

没有错误然后我试图在C ++中使用这个DLL。 但是,如果我通过C#应用程序从DLL调用函数,我看到错误(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.

怎么解决这个麻烦?

您可以从DLL中删除对CoInitializeExCoInitializeSecurity的调用。 它们已经在线程上被调用 - 这就是你得到这些错误的原因。

但是,如果您的DLL尝试将COM线程初始化为多线程单元,并且您的C#应用​​程序在单线程单元上调用DLL,那么您可能具有基本的不兼容性。 这取决于指定COINIT_MULTITHREADED的代码行是否是故意选择的原因,或者只是在最初编写时似乎COINIT_MULTITHREADED东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM