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

Big*_*uce 9 .net c# com regasm visual-c++

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

事实

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

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

    CSharpProjectName::IPersonPtr pPersonPtr;
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);
Run Code Online (Sandbox Code Playgroud)

即使我使用"regasm/codebase"注册c#.dll并确认注册表中存在密钥,为什么我会收到"未注册类"错误?

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

Jos*_*son 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 ...

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