C#通过COM组件调用C++的代码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#通过COM组件调用C++的代码.doc

C#通过COM组件调用C++的代码 这个主题在《c#高级编程》中有提到,可以下本电子书来看看。一下我也列出自己的学习笔记。 根据网上的说法,C#调用C++至少有以下几种方法: 1通过COM组件调用 2通过MC++转接 3利用Intptr ? 由于我只能成功使用COM组件的方法,所以下面只谈一下这个方法。 ? 一.通过ALT建立COM组件 1、创建ATL Project 步骤1:建立一个解决方案。   步骤2:在 该解决方案中,新建一个 vc++ 的 ATL 项目。见下图 选择Dynamic-link library(DLL) 2、向工程中添加ATL对象 选择ATL Simple Object 名字为FunTest Interface选择Custom 3、在接口中添加方法.(在类视图中) 方法名为Sum,参数如下图,有三个参数 ? 接口方法的实现, 这个太简单了 STDMETHODIMP CFunTest::Sum(LONG num1, LONG num2, LONG* pVal) { // TODO: Add your implementation code here *pVal = num1 + num2; return S_OK; } ? 二.在C#中调用COM组件 1、新建一个C# console项目,比如叫Test(winform的也是一样道理,只是Console调试更方便而已。第一次在C#中调用COM组件时,建议先用Console试试,否则会搞得一头烟) 2、添加引用: 在弹出的对话框中选COM子页,找到ATLProjectTest 1.0类型库(或类似的东西) 就会发现在Test-引用下多了ATLProjectTestLib 3在主函数(program.cs)中调用组件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ATLProjectTestLib; namespace Test { class Program { static void Main(string[] args) { ATLProjectTestLib.FunTestClass f1 = new FunTestClass(); Console.Write (f1.Sum(3,4)); } } } ? 三.很多的细节及注意事项 仅按上面一步步地操作下来发现还会出错,会说找不到XX COM组件,或是COM组件没注册。实际上很多不当操作都会导致上面这个错误。只有当你生成的文件中有Interop.ATLProjectTestLib.dll时,你才算成功了。 1、所有修改都要重新编译。如修改了ATL项目,首先要重新编译ATL,再重新编译C# project。当把项目移到另一台计算机,有时编译器由于ATL项目没有被修改,而不会重新编译,这就无法写注册表。这时可以把ATL项目的Debug文件夹删除,再重新编译。 2、在创建ATL project时,由于一个选Dual或Custom的地方,我认为应该选Dual,但网上较多文章选Custom。 以下是选了Custom后应做的补救, 回到ATLProjectTest,在ATLProjectTest.idl中(或双击 类视图-IFunTest) import oaidl.idl; import ocidl.idl; [ object, uuid7218-4CA1-AADC-EAF3C42AB24B), dual, //--------按原做法不设这个属性,只有设了这个属性才不会错 helpstring(IFunTest 接口), pointer_default(unique) ] ? 3、ATL默认按32位编译,而C#中一般是按any CPU形式,像我是64位机的就要小心了。要改一下C#项目中的生成规则。 点击项目的属性页: 设置目标平台为x86 4、做完上面这3点,大概Test应该能运行了。可以先跳到第四大点看完后再倒回来。 在实际的工程中,一般有很多个项目,假设以C#项目为主,还有一个ATL项目ATLProjectTest。而这个ATLProjectTest被Business项目(逻辑层)调用,而Business又被Form项目(用户层)调用,这都是很常见的。 在“编译”时就不能直接启动调试,要按ATLProjectTest-Business-Form的顺序一个个地

文档评论(0)

jackzjh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档