2012-03-14 40 views
8

在一个VC++项目中,我试图创建一个包含在C#项目中的C#类的实例(通过COM)。类未注册的错误,通过COM实例化C#对象从VC++

事实

  • 无论是C#和C++项目使用.NET 4.0
  • 的C#的.dll正在使用regasm /基本代码 “CSharpProjectName.dll””注册编译,并且Windows命令提示报道,“类型注册成功。”
  • 在C++项目,我试图创建在C#项目中的类的实例,但我得到的0x80040154的的HRESULT - 类没有注册

这是我尝试从C#.dll创建.NET对象实例的一个示例。我试图实例化的具体类是所谓的员工,这对于只是提出我的问题的缘故,实现IPerson接口:

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

为什么我甚至收到“类未注册”的错误,虽然我注册的c#.dll使用“regasm/codebase”并确认注册表中存在密钥?

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

+0

我有这个确切的问题! – TinyRacoon 2016-03-17 15:43:35

回答

9

我以前有过这个问题,这是由于这两个进程不是32位或64位。如果您正在运行32位操作系统,则可以立即停止阅读,因为我所说的内容不适用。

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

如果您需要注册的64位蜂巢,你可能需要调用RegAsm.exe版本下的C:\ WINDOWS \ microsoft.net \ framework64 ...

其他的事情可能性出问题的是,您可能需要运行regasm.exe的.NET 4.0版本。如果您只是在命令行中键入“regasm”,它会为您提供正在运行的regasm版本。您可能需要输入regasm的.NET 4.0版本的完整路径 - 可在c:\ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe中找到。

+1

就是这样!我正在使用v2.0 ... regasm而不是v4.0 .... regasm。非常感谢! – BigSauce 2012-03-14 23:43:38

+0

因此,如果所需的CLID是91493441-5A91-11CF-8700-00AA0060263B,并且尝试搜索后无法在当前注册表(regedit)之间找到它? – 2015-07-29 16:32:26

1

您是否试过/tlb选项?试试看,然后

#import "your_tlb_file_lol.tlb" no_namespace 

我认为其他选项可能是gac程序集,然后regasm它。

+0

我试过用**#导入“CSharpProjectName.tlb”named_guids raw_interfaces_only **。仍然没有... – BigSauce 2012-03-14 22:27:25

0

试图离开你的项目在32位,因为你知道你的项目,在任何CPU创建运行在32注册表错误的活性成分,所以构建更改为32或优选至32

你太注册你DLL与regsvr32

相关问题