在C#中使用使用COM的DLL

3

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

我在使用这个dll时,在C++中没有出现任何错误。但是,如果我通过C#应用程序调用DLL中的函数,则会出现错误(80010106) Cannot change thread mode after it is set. 我更改了

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.

如何解决这个问题?

1个回答

3
您可以从您的DLL中删除对CoInitializeExCoInitializeSecurity的调用。它们已经在线程上被调用-这就是为什么您会收到这些错误提示。
然而,如果您的DLL试图将COM线程初始化为多线程公寓,并且您的C#应用程序在单线程公寓上调用了该DLL,则可能存在基本不兼容性。这取决于指定COINIT_MULTITHREADED的代码行是否是有原因的有意选择,还是只是在最初编写时似乎有效的东西。

谢谢。请看一下这个相关问题。我无法确定在托管应用程序中放置这些调用的位置。 - Raheel Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接