C#写COM组件注册问题

shockcqyc 2014-07-14 11:53:42
用C#写了一个COM组件,能正常调用。但就是如果有新版本,在注册时用REGASM /U旧版本的DLL后,注册表还是有旧版本的注册信息,并没有删除。怎么做才能在每次注册新版本DLL时将旧版本的注册信息全部删除?
另外,在项目的程序集信息里已经有了GUID:[assembly: ComVisible(true)] [assembly: Guid("ce925f04-d7be-4ed8-90e9-c3f2997bd90d")],还需要在代码中接口前生成新的GUID吗?
(这里需要重新生成GUID吗)
public interface ICLINIC_TRIAGE
{
//属性
......
//方法
......
}
(这里需要重新生成GUID吗)
[ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ICLINIC_TRIAGE))]
public class CLINIC_TRIAGE : ICLINIC_TRIAGE
{
......
}
...全文
2325 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lckj2009 2014-08-16
  • 打赏
  • 举报
回复
引用 楼主 LiShock 的回复:
用C#写了一个COM组件,能正常调用。但就是如果有新版本,在注册时用REGASM /U旧版本的DLL后,注册表还是有旧版本的注册信息,并没有删除。怎么做才能在每次注册新版本DLL时将旧版本的注册信息全部删除? 另外,在项目的程序集信息里已经有了GUID:[assembly: ComVisible(true)] [assembly: Guid("ce925f04-d7be-4ed8-90e9-c3f2997bd90d")],还需要在代码中接口前生成新的GUID吗? (这里需要重新生成GUID吗) public interface ICLINIC_TRIAGE { //属性 ...... //方法 ...... } (这里需要重新生成GUID吗) [ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ICLINIC_TRIAGE))] public class CLINIC_TRIAGE : ICLINIC_TRIAGE { ...... }
那我每个类和每个接口都用AssemblyInfo的GUID吗?一样吗?
threenewbee 2014-07-15
  • 打赏
  • 举报
回复
regasm -u -codebase呢
save4me 2014-07-15
  • 打赏
  • 举报
回复
regasm时如果失败,尝试dll写完整路径。 参考: C#组件开发:COM和.NET对象之间的互操作
引用
每个COM组件接口都有一个唯一的GUID,在.NET接口的定义中由Guid属性来指定
引用
每个COM组件接口的实现类也都有一个唯一的GUID,由Guid属性来定定义
关于生成GUID,参考: C#创建com组件
引用
在VS2010的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择,点击"新建 Guid",然后"复制"就行了(以下如有guid的字符串,全部同样操作)
引用 3 楼 LiShock 的回复:
哦 是我写错了 应该是 regasm /u cqyc_triage.dll /tlb:cqyc_triage.tlb 还有就是那个GUID,百度出来的都是加了GUID的,而且接口和实现接口的类都有不一样的GUID,程序集信息不是自动生成了GUID了吗,需要那样做吗?
shockcqyc 2014-07-15
  • 打赏
  • 举报
回复
还有一种情况,regasm 是必须指定目录,注册后,如果把包含该DLL的文件夹删掉,这时该怎么从注册表卸载该DLL呢
shockcqyc 2014-07-15
  • 打赏
  • 举报
回复
哦 是我写错了 应该是 regasm /u cqyc_triage.dll /tlb:cqyc_triage.tlb 还有就是那个GUID,百度出来的都是加了GUID的,而且接口和实现接口的类都有不一样的GUID,程序集信息不是自动生成了GUID了吗,需要那样做吗?
save4me 2014-07-15
  • 打赏
  • 举报
回复
参考: ActiveX控件开发
引用
关于三个接口的具体描述,可以参考《C#高级编程第三版》28.1.3 接口。在MSDN上查找,可以知道IObjectSafety继承自IUnknown,是一个定制接口;通过上一章节,可以发现向COM注册时,需要提供一个Guid作为CLSID来标识程序集中的C#类,事实上在COM中,接口和类型库都是带有Guid作为唯一标识的,分别为IID和typelib id。这样,通过在C#编写的接口标上需要的COM接口IID,就可以在注册是向COM表明接口身份了。
另外参考: COM IDs & Registry keys in a nutshell
引用
The main COM IDs are: LIBID: the Type Library ID, based on GUID. APPID: the Application ID, based on GUID. CLSID: the COM Class ID, based on GUID. IID: the Interface ID, based on GUID. PROGID: the Program ID, based on a text string.
引用 6 楼 LiShock 的回复:
那接口类的GUID、接口实现类的GUID与程序集信息中的GUID有什么关系呀?
shockcqyc 2014-07-15
  • 打赏
  • 举报
回复
而且我在写COM组件的时候,除了接口类、接口实现类,还写了其他的类,那么那些其他的类是不是也需要GUID呀?
shockcqyc 2014-07-15
  • 打赏
  • 举报
回复
那接口类的GUID、接口实现类的GUID与程序集信息中的GUID有什么关系呀?
threenewbee 2014-07-14
  • 打赏
  • 举报
回复
千万不要新的guid,那样被视作两个 卸载好像是 regasm -u 吧,你试试。

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧