我一直在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.
如何解决这个问题?
答案 0 :(得分:2)
您可以从DLL中删除对CoInitializeEx
和CoInitializeSecurity
的调用。它们已经在线程上被调用 - 这就是你得到这些错误的原因。
但是,如果您的DLL尝试将COM线程初始化为多线程单元,并且您的C#应用程序正在单线程单元上调用DLL,那么您可能具有基本的不兼容性。这取决于指定COINIT_MULTITHREADED
的代码行是否是故意选择的原因,或者只是在最初编写时似乎有用的东西。