注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

C++调用C# COM组件  

2011-10-12 11:55:12|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C#编写COM组件:
1.创建一个C#的dll类库MyInterop
2.将打开项目属性页面,打开“应用程序/程序集信息”,选中“使程序集COM可见”。这样编译好的C# dll将支持通过COM的形式访问。

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


3.在“生成“属性页面,选中”为COM互操作注册”。这样项目编译后会自动将生成的dll注册为COM组件

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


4.在“签名”属性页面,选中“为程序集签名”,点击新建

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


5.在弹出的“创建强名称密钥”对话框中输入适当的密钥文件名称,并取消“使用密码保护密钥文件”的选项

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


6.“确定”后会自动创建一个snk文件的密钥文件,用于给程序集签名。

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡

 
7.经过以上繁杂的设置,可以果断编译。
8.若发现以下编译错误,说明COM注册的权限不足。请以管理员身份重新打开VS:
“error MSB3216: 无法注册程序集“***.dll”- 拒绝访问。请确保您正在以管理员身份运行应用程序。对注册表项“HKEY_CLASSES_ROOT\***”的访问被拒绝。”

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


9.成功编译后,生成的dll就会顺利注册为COM组件,以图为证:

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡


10.然后请将以下代码输入到项目中(鉴于排版视觉效果,本文代码采用截图而非文本。在VS强大的自动提示下手工代码相信会很容易):
C++调用C COM组件 - 秒大刀 - 秒大刀的城堡
 
11.其中的Guid可以通过以下方式生成/拷贝:

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡

 
12.再次编译,并可在“MyInterop\bin\Debug”目录下发现多生成一个“MyInterop.tlb”文件。至此,C#的COM组件创建完毕。


C++调用COM组件:
1.创建一个C++ Win32 控制台应用程序Call_CSharp_COM
2.在Call_CSharp_COM.cpp中输入以下代码:
C++调用C COM组件 - 秒大刀 - 秒大刀的城堡

3.编译,运行:

C++调用C COM组件 - 秒大刀 - 秒大刀的城堡



补充:
  1. 以上demo并未将.net dll部署到GAC,可以通过命令“gacutil /i MyInterop.dll”进行GAC部署操作。只有经过强名称签名的.net程序集可以顺利部署到GAC,这也是demo中选择对程序集签名的原因。没有经过强名称签名的程序集也可以“私有部署”到exe所在的目录或符合dll搜索顺序的路径中。
  2. COM注册也可以通过命令“REGASM MyInterop.dll /tlb:MyInterop.tlb”进行,同样需要管理员身份
  3. 用C++以COM调用C#比预想的简单多了C++调用C COM组件 - 秒大刀 - 秒大刀的城堡

参考:
  评论这张
 
阅读(11214)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017