电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

C++-COM与C组件的互操作VIP专享VIP免费

C++-COM与C组件的互操作_第1页
C++-COM与C组件的互操作_第2页
C++-COM与C组件的互操作_第3页
word格式-可编辑-感谢下载支持C++环境下按COM方式调用C#组件的方法1.互操作基础首先需要声明清楚的是:COM与.NET组件(准确的说,应该叫程序集,Assembly)是两个不同的概念!COM组件对象模型是微软早期的一种软件复用标准和技术方案,用IDL语言定义接口,用非托管语言(C++)定义类以实现接口功能,编译生成DLL组件,并生成相应的类型定义库TLB。而.NET程序集则是一种基于CLR的多编程语言无缝集成的软件封装技术。可采用.NET编程语言(C#,VB.NET)直接定义接口与类,能够简单生成程序集。编写源代码时按照一定的要求赋予GUID属性,生成DLL后注册到GAC即可实现共享复用。AlthoughCOMclientscancallcodethatisexposedinapublicclassby.NETservers,.NETcodeisnotdirectlyaccessibletoCOMclients.Inordertouse.NETcodefromaCOMclient,youneedtocreateaproxyknownasaCOMcallablewrapper(CCW).COMCallableWrappers(COM包装)COM在以下几个重要方面与.NETFramework对象模型存在差异:生命周期(自己管理/CLR管理)、对象实例的获取(接口指针QueryInterface/反射)、内存的管理(位置不变/CLR调整)。CCW概览图通过运行时可调用包装(RCW)访问COM对象ManagedcodecomponentsnotonlydependontheCLR,theyrequirethecomponentswithwhichtheyinteracttodependontheCLR.BecauseCOMcomponentsdon'toperatewithintheCLR,theyareunabletocallmanagedcodecomponentsdirectly.TheunmanagedcodesimplycannotreachintotheCLRtodirectlycallmanagedcomponents.Thewayoutofthisdilemmaistouseaproxy(CCW).2.开发一个面向非托管客户的.NET程序集步骤要使基于.NET的Class以COM组件的形式对非托管代码可见(可调用),必须要满足两个基本条件:word格式-可编辑-感谢下载支持一是,必须给Interface和Class分别添加GUID属性;二是,必须导出程序集对等的COM类型库TLB并且在注册表中注册组件信息(这里的组件即InteropCOM,此组件实际上以托管程序集的形势存在,在被调用时,由CCW将其实例化为内存中的COM对象并管理其生存周期与内存释放)。创建.NET程序集的大致步骤如下:1)定义接口,并创建类以实现接口功能。添加引用:;;在类与接口定义前分别添加GUID属性,代码如下[Guid("03AD5D2D-2AFD-439f-8713-A4EC0705B4D9")]在类定义前添加属性[ClassInterface(ClassInterfaceType.None)]。设置[assembly:ComVisible(true)]使得对COM可见(重要!)2)给程序集添加版本属性;添加强命名Key(非必须);3)[非必须步骤]将程序集添加到公用程序集缓冲区。Installthe.NETassemblyintotheGlobalAssemblyCache(GAC)sothatitwillbeavailableasasharedassembly.ToinstallanassemblyintotheGAC,usethegacutiltool:gacutil/iYourNETServer.dll4)从生成的DLL类库中导出类型库(typelibrary,TLB),并注册COM组件。可调用Regasm工具(AssemblyRegistrationTool)一步完成。如果只需要导出tlb,可以使用Tlbexp工具(typelibraryexporter)。当重新编译生成Dll时需要使用REGASM/u命令将前一次Dll注销。或者,最直接最简单的方式是设置项目属性,在[生成]选项卡中,将“为COMInterOp注册”选项设置为true即可在生成程序集时完成注册。REGASMComInteropDemo.dll/tlbComInteropDemo.tlbREGASM/uComInteropDemo.dll注意:程序集可以是专用的或共享的(在GAC中)。专用程序集仅用于与该程序集位于同一目录结构的客户端;共享程序集可用于任何本地COM应用程序。所有程序集和类型库都必须在Windows注册表中注册,以便COM客户端透明地使用托管类型。共享程序集应安装在全局程序集缓存中。所有共享程序集必须带有强名称(由发行者签名,可运行命令:sn-kNETServer.snk。生成strongnamekey文件(存储了公钥密钥对),编译项目时放在bin程序目录下.)。当任何引用程序集中类型的COM应用程序遇到Mscoree.dll时,都会查找该程序集。3.在非托管环境下(C++)编写客户端调用.Net组件1)新建C++工程。在CPP源文件中添加代码导入COM引用。(可以导入DLL或导入TLB)#import“\com.MyInterop.tlb"named_guidsraw_interfaces_only2)添加代码调用COM对象。CoInitialize(NU...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部