9

在 VC++ 项目中,我试图创建 C# 项目中包含的 C# 类的实例(通过 COM)。

事实

  • C# 和 C++ 项目均使用 .NET 4.0 编译
  • 正在使用regasm /codebase "CSharpProjectName.dll" " 注册 C# .dll,并且 Windows 命令提示符报告“类型注册成功。”
  • 在 C++ 项目中,我尝试在 C# 项目中创建一个类的实例,但我得到一个0x80040154 的 HRESULT - 类未注册

这是我尝试从 C# .dll 创建 .NET 对象实例的示例。我试图实例化的具体类称为 Employee,为了简单地提出我的问题,它实现了 IPerson 接口:

    CSharpProjectName::IPersonPtr pPersonPtr;
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);

为什么即使我使用“regasm /codebase”注册了 c# .dll 并确认注册表中存在该键,我也会收到“类未注册”错误?

任何帮助将不胜感激。谢谢!

4

3 回答 3

10

我过去遇到过这个问题,这是由于两个进程都不是 32 位或 64 位。如果您运行的是 32 位操作系统,您现在可以停止阅读,因为我所说的不适用。

使用 regedit 尝试在注册表中查找您的 ProgId 和 CLSID。如果您的 C++ 项目是 32 位的,请确保您的 C# 类已注册到 32 位配置单元--HKEY_CLASSES_ROOT\Wow6432Node。如果您的 C++ 项目是 64 位的,请确保您的 C# 类已注册到 64 位配置单元--HKEY_CLASSES_ROOT。

如果需要注册到64位hive,可能需要调用c:\windows\microsoft.net\framework64下的RegAsm.exe版本...

出现问题的另一种可能性是您可能需要运行 regasm.exe 的 .NET 4.0 版本。如果您只是在命令行中键入“regasm”,它将为您提供正在运行的 regasm 版本。您可能需要键入 regasm 的 .NET 4.0 版本的完整路径 - 位于 c:\windows\microsoft.net\framework\v4.0.3019\regasm.exe。

于 2012-03-14T22:51:09.397 回答
1

你试过这个/tlb选项吗?试试看,然后

#import "your_tlb_file_lol.tlb" no_namespace

我认为另一种选择可能是 gac 程序集,然后重新充气。

于 2012-03-14T22:18:57.953 回答
0

尝试将您的项目保留为 32 位,因为您知道您的项目,在 Any CPU 中创建一个以 32 运行并出现注册表错误的活动组件,因此将构建更改为 32 或最好更改为 32。

你也用 regsvr32 注册你的 dll

于 2018-01-29T17:23:08.387 回答