Can';t创建C#COM对象(类未注册) 我的全球目标是创建一个基于COM的应用程序,其中客户端部分是C++代码和服务器部分-C。看起来很简单

Can';t创建C#COM对象(类未注册) 我的全球目标是创建一个基于COM的应用程序,其中客户端部分是C++代码和服务器部分-C。看起来很简单,c#,c++,visual-studio-2008,com,registry,C#,C++,Visual Studio 2008,Com,Registry,我尝试使用MSDN中的样本: 我用两个项目(使用VisualStudio2008)制作了一个解决方案,并进行了编译。嗯 我手动注册组件。(参考文献1) 但当我运行客户端应用程序时,CoCreateInstance返回HRESULT“未注册的类” 在步骤(参考1)中,我尝试使用: 1) regasm server.dll/tlb:server.tlb(当然,cpp源中的文件名现在是兼容的)(来自MSDN) 2) regasm server.dll/tlb:server.tlb gacutil/i

我尝试使用MSDN中的样本:

我用两个项目(使用VisualStudio2008)制作了一个解决方案,并进行了编译。嗯

我手动注册组件。(参考文献1)

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

在步骤(参考1)中,我尝试使用:

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

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

但我是舒尔,此示例有效!一旦我做了很多不同的动作而没有改变guid和。。。它起作用了!但我更改了GUID,尝试注册-没有结果。我不能重复这种情况。魔法

请帮帮我!我需要一个准确的alhoritm,无需更改源(optionnal)和注册表中的手动工作(在我的情况下完全不可能)

//对不起,我的英语不是很好

在注册表中,可以看到my类,但InprocServer的“默认值”是mscore.dll

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

您应该在dev计算机上使用/codebase选项运行regasm.exe,这样就不必在GAC中使用gacutil.exe注册程序集。你已经试过了。您现在要解决注册表问题,本机程序无法找到您使用Regedit.exe找到的注册表项。一个非常常见的原因是在64位操作系统上运行。如果COM客户端是32位程序,则应使用32位版本的Regasm.exe(来自Framework,而不是Framework64)。因此,注册信息将进入HKLM\Software\Wow6432Node\Classes\CLSID,而不是HKLM\Software\Classes\CLSID。WOW6432节点是不同的,它是32位注册的主节点

当所有其他操作都失败时,请使用SysInternals的ProcMon实用程序。它允许您查看本机程序在注册表中搜索注册项的位置

在注册表中,可以看到my类,但InprocServer的“默认值”是mscore.dll

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

您应该在dev计算机上使用/codebase选项运行regasm.exe,这样就不必在GAC中使用gacutil.exe注册程序集。你已经试过了。您现在要解决注册表问题,本机程序无法找到您使用Regedit.exe找到的注册表项。一个非常常见的原因是在64位操作系统上运行。如果COM客户端是32位程序,则应使用32位版本的Regasm.exe(来自Framework,而不是Framework64)。因此,注册信息将进入HKLM\Software\Wow6432Node\Classes\CLSID,而不是HKLM\Software\Classes\CLSID。WOW6432节点是不同的,它是32位注册的主节点


当所有其他操作都失败时,请使用SysInternals的ProcMon实用程序。它可以让您看到本机程序在注册表中搜索注册项的位置。

我想您应该试试下面这句话:
regasm/codebase server.dll/tlb server.tlb

我想你应该试试这句话:
regasm/codebase server.dll/tlb server.tlb

mscore.dll的InprocServer值正确。mscore.dll的InprocServer值正确。谢谢你,Hans,它正在工作。问题是我的命令行被命令“regasm”使用了64版本。谢谢你,Hans,它正在工作。问题是我的命令行被命令“regasm”使用了64版本。