gpt4 book ai didi

c# - 在 C# 中使用使用 COM 的 DLL

转载 作者:行者123 更新时间:2023-11-30 17:23:00 26 4
gpt4 key购买 nike

我一直在用 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 的代码行是经过深思熟虑的选择并有其背后的原因,还是只是在最初编写时似乎有效的东西。

关于c# - 在 C# 中使用使用 COM 的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com