不能创建c# COM对象(类未注册)
本文关键字:注册 对象 创建 COM 不能 | 更新日期: 2023-09-27 18:02:20
我的总体目标是创建一个基于com的应用程序,其中客户端部分是c++代码,服务器部分是c#。它看起来很简单。
我尝试使用来自MSDN的示例:http://msdn.microsoft.com/en-us/library/aa645738 (v = vs.71) . aspx
我用两个项目(使用VisualStudio2008)制作解决方案并编译。好。
手动注册组件。(ref1)
但是当我运行客户端应用程序时,CoCreateInstance返回HRESULT "Class not registration "。
在步骤(ref1)我尝试使用:
1) regasm server.dll/tlb:tlb (cpp源代码中的文件名现在是兼容的,原因)(来自MSDN)
2) regasm server.dll/tlbGacutil/i server.dll
3) regasm/codebase/tlb server.dll
在注册表中看到我的类,但InprocServer的"默认值"是mscore.dll。与另一个注册表笔记相比,这看起来像是一个错误。我尝试手动编辑此值-没有结果。
但我很高兴,这个样本工作!一旦我在不改变guid的情况下做了很多很多不同的动作……它的工作原理!但我改变GUID的,尝试注册-没有结果。我不能再重蹈覆辙了。魔法…
请帮帮我!我需要一个精确的算法,不需要更改源(可选),也不需要在注册表中手工操作(在我的情况下完全不可能)。
//对不起,我的英语不太好。
在注册表中看到我的类,但InprocServer的"默认值"是mscore.dll
不,这不是一个错误。dll是CLR的引导程序,它确保CLR被正确加载和初始化,以允许托管代码在没有CLR支持的本地应用程序中运行。它还提供了COM服务器必须提供的DllGetClassObject入口点。托管程序集没有像DllGetClassObject那样具有本机导出的通用方法。
你应该在你的开发机器上使用/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。Wow6432Node是不同的,它是32位注册的主节点。
当所有这些都失败时,使用SysInternals的ProcMon实用程序。它可以让您看到本机程序在注册表中搜索注册键的位置。
我想你应该试试下面这句话:regasm /codebase server.dll /tlb server.tlb