当 64 位非托管代码通过 COM 调用托管代码时会发生什么

What happens when 64-bit unmanaged code calls managed code via COM

当您使用 CoCreateInstance 从 64 位非托管代码创建托管代码 COM 对象时会发生什么。

我有一个 dll,它包装了提供 COM 接口的 log4net。我正在调用 CoCreateInstance,它返回 class not registered 错误。我已经 运行 在 dll 上重新加载,我看到条目出现在寄存器中。我怀疑这是某种 32/64 位不匹配。当从 64 位 dll 调用时,我假设托管 dll 是 JIT'ed x64。有谁知道从 64 位 dll 创建托管 COM 对象时会发生什么?关于检查内容的任何建议,事情似乎适用于 32 位 dll。

谢谢

这是一个 classic 32/64 不匹配问题。

您要做的是向 64 位 .NET 运行时注册您的 .NET DLL。在 "c:\windows\microsoft.net\framework64\vXYZ\regasm.exe" 中使用 "regasm /tlb /codebase",其中 XYZ 是版本。

如果您在 .NET class 中搜索对象的 CLSID,您会在 HKEY_CLASSES_ROOT\Wow6432Node\CLSID 配置单元中找到它,但不会在 HKEY_CLASSES_ROOT\CLSID 配置单元中找到它。使用 64 位工具注册后,您将在 HKEY_CLASSES_ROOT\CLSID.

中找到您的 CLSID

您可能还想看看这个答案:Class not registered error for Instantiation of C# object via COM from VC++