类未注册通过VC++的COM实例化C#对象的错误

本文关键字:COM 实例化 对象 错误 VC++ 注册 | 更新日期: 2023-09-27 18:27:54

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

事实

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

下面是我试图从C#.dll创建.NET对象实例的一个例子。我试图实例化的具体类名为Employee,为了简单地回答我的问题,它实现了IPerson接口:

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

为什么我使用"regasm/codebase"注册了c#.dll并确认了注册表中存在该项,但却出现了"class not registered"错误?

如有任何帮助,我们将不胜感激。谢谢

类未注册通过VC++的COM实例化C#对象的错误

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

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

如果您需要注册到64位配置单元,您可能需要调用c:''windows''microsoft.net''framework64下的RegAsm.exe版本…

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

您尝试过/tlb选项吗?试试看,然后

#import "your_tlb_file_lol.tlb" no_namespace

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

尝试将您的项目保留为32位,因为您了解您的项目,在Any CPU中创建一个在32位运行的活动组件,但存在注册表错误,因此将构建更改为32,或者最好更改为32。

您也用regsvr32 注册dll