2010-03-16 72 views
3

我一直在C++上编写DLL,这将在C#中使用。 DLL有一定的功能,在那里我称之为使用在C#中使用COM的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)设置后无法更改线程模式。我改变

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. 

如何解决这个问题?

回答

2

您可以从DLL中删除对CoInitializeExCoInitializeSecurity的调用。他们已经被调用线程 - 这就是为什么你得到这些错误。但是,如果您的DLL尝试将COM线程初始化为多线程单元,并且您的C#应用​​程序正在单线程单元上调用DLL,那么您可能会遇到基本不兼容问题。这取决于指定COINIT_MULTITHREADED的代码行是否是一个有意的选择,其背后有一个原因,或者只是在它最初编写的时候才起作用。

+0

谢谢。请看看[这个相关的问题](http://stackoverflow.com/q/29385515/938668)。我无法确定将这些调用放在托管应用中的位置。 – 2015-04-01 09:29:55