c# - 无法创建 C# COM 对象(类未注册)

标签 c# c++ visual-studio-2008 com registry

我的总体目标是创建一个基于 COM 的应用程序,其中客户端部分是 C++ 代码,服务器部分是 C#。看起来很简单。

我尝试使用 MSDN 中的示例: http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx

我用两个项目(使用 VisualStudio2008)制作了一个解决方案并编译。好吧。

我手动注册组件。 (引用文献 1)

但是当我运行客户端应用程序时,CoCreateInstance 返回 HRESULT“类未注册”。

在步骤 (ref1) 上我尝试使用:

1) regasm server.dll/tlb:server.tlb(cpp 源中的文件名现在是兼容的)(来自 MSDN)

2) regasm server.dll/tlb:server.tlb gacutil/i server.dll

3) regasm/codebase/tlb server.dll

在注册表中看到我的类,但 InprocServer 的“默认值”是 mscore.dll。与另一个注册表说明相比,它看起来像错误。 我尝试手动编辑此值 - 没有结果。

但我敢肯定,这个示例有效!一旦我在不更改 GUID 的情况下完成了许多不同的操作并且......它起作用了!但我更改了 GUID,尝试注册 - 没有结果。我不能重复这种情况。魔法...

请帮帮我!我需要一个精确的算法,无需更改源(可选)并且无需在注册表中进行手动操作(在我的情况下完全不可能)。

//对不起,我的英语不完美。

最佳答案

In the registry a see my class, but "default value" of InprocServer is mscore.dll

不,这不是错误。 Mscoree.dll 是 CLR 的 Bootstrap ,它确保正确加载和初始化 CLR,以允许托管代码在没有 CLR 支持的 native 应用程序中运行。它提供了 COM 服务器必须提供的 DllGetClassObject 入口点。托管程序集没有像 DllGetClassObject 这样的 native 导出的通用方法。

您应该在您的开发机器上使用/codebase 选项运行 regasm.exe,这样您就不必在 GAC 中使用 gacutil.exe 注册程序集。您已经尝试过。您现在遇到了注册表问题, native 程序无法找到您使用 Regedit.exe 找到的注册表项。一个很常见的原因是在 64 位操作系统上运行。如果 COM 客户端是 32 位程序,您应该使用 32 位版本的 Regasm.exe(来自 Framework,而不是 Framework64)。这样注册信息就会进入 HKLM\Software\Wow6432Node\Classes\CLSID 而不是 HKLM\Software\Classes\CLSID。 Wow6432Node 是不同的,它是 32 位注册的家。

当所有其他方法都失败时,请使用 SysInternals 的 ProcMon 实用程序。它可以让您看到 native 程序在注册表中的哪个位置搜索注册 key 。

关于c# - 无法创建 C# COM 对象(类未注册),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6734699/

相关文章:

c# - 使用面板 asp/css 框内有 4 个框的框

c# - 如何使用 LINQ to XML 将 XML 元素移动到前一个元素之上?

c++ - 段错误

asp.net - Visual Studio 强制缩进

c# - WPF ObservableList 调度程序线程

c# - 在 aspx 页面中加载一个又一个控件

C++避免反斜杠和双引号转义

c++ - 避免编译 ISO C++

vb.net - vb.net中的表单的自定义构造函数: Best practices

c# - 代码格式样式 - 哪一种更可取