C++调用C# COM组件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

原文地址 http://dearymz.blog.163.com/blog/static/2056574201191295525523/ 

感谢原作者分享


从C#创建COM,再到C++调用COM。   适合入门及快速应用。

但是环境要求没有介绍,不清楚此发布的COM是否需要调用客户机有framework环境。


写COM调用,是由于写DLL,C++必须使用CLR编译。

===========================================以下正文==============================================================

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组件 - 秒大刀 - 秒大刀的城堡

C++ 调用com的几种方式。 1. 使用tlb 文件:  #import "MyCom.tlb" CoInitialize(NULL); MyCom_iPtr ptr(__uuidof(MyCom)); ptr->func(); CoUninitialize(); 2. 阅读详情

相关推荐

VS2017 C++调用C#生成的COM组件

C#生成COM组件: VS2017 ——> 新建 ——> 项目 ——> Visual C# ——> 类库(.NET Framework) *注意:如果选择 "类库(.NET Standard)" 后面可能无法选择 "为COM互操作注册",同时记住选择的.NET Framework的版本 示例:新建的工程名为 ComExample,重命名Class1.cs为Com...

TDJ1346的博客 3247

C++调用C#编写的COM组件

??????C++??????????C#???????C#?DLLC++????????????????????C#??COM???C++??? ??????????????? ????????????????????????????? ???VS2010 ???win764 32 ????C#??COM?? ????????????   ??   ??

MR_Sjx的博客 1633

C++ 调用 C#COM组件

一、C#新建COM组件 1. 新建一个C#类       1) 新建 -> 项目 -> Visual C# -> 类库        2) 修改属性:  属性 ->  应用程序 -> 程序集信息 -> 选“使程序集COM可见”                3)修改属性: 属性 -> 生成 -> 选“为COM互操作注册” 2.  生成密钥文件 属性

poemqiong的专栏 1168

C++调用C#创建的COM组件

组件基本概念 COMComponet Object Model)组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。 .

liulv_yan的博客 3663

c++ 调用c#dll (2种方式,com组件和clr工程)

c++ 调用c#dll ,com组件和clr工程两种方式分别实现成功

qq_43525389的博客 9095

C#调用C++函数来与串口通信

前些日子帮朋友写个小软件,要求用C#来实现主程序,主要的功能是与一些通信设备打交道,当然就是通过串口了,以十进制发送和读取串口 的数据,考虑到C#调用API并没有C++来得方便,因此,我用C++封装了一个读写串口的DLL,只提供一个函数供外部调用,这样的好处在于,C# 只要调用这个函数发送完数据后,函数立即就能获得串口返回的数据。另一个好处在于,一些不熟悉C++的朋友,也能够直接通过这

风---的专栏 1872

C# 开发COM组件C++调用

C# 开发COM组件c++使用 Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及.NET如何调用SDK中的Windows库函数。 本文在学习网上资料的基础上,实现用C#开发组件C++使用的过程。 编程环境:vs2015 (COM组件) vs2005 c++...

Sayesan的专栏 959

C++调用C#编写的com组件方法

C#com组件编写可以参照https://www.jianshu.com/p/be7f61ba7c86 下面主要讲解如何调用 首先在Visualstudio中新建项目,注意是win32应用程序 关键点到了,因为涉及到跨语言的调用,因此会使用到代码托管的功能,需要勾选 /clr框框里的选项,公共语言运行时支持 然后导入dll文件,具体导入方法可以参考我的另一篇文章,https:/...

qwezhaohaihong 1386

使用C++在VS2005开发COM组件C#调用教程

接口是COMComponent Object Model)编程中的核心概念。在COM中,接口定义了一个对象必须实现的一组方法,而不涉及具体如何实现这些方法。这样的设计使得COM组件能够独立于编程语言和平台,因为只要组件遵循接口定义,任何语言编写的程序都可以通过这些接口与之交互。COM接口是通过GUID(全局唯一标识符)来唯一标识的,这保证了接口的全球唯一性。接口的重要性体现在以下几个方面:抽象化和模块化。

weixin_42518334的博客 912

如何从c++调用c#com组件

开发环境VS2005 1、  首先创建一个c#的类库项目。2、  将AssemblyInfo.cs文件中的[assembly: ComVisible(false)]改为[assembly: ComVisible(true)],或者在项目属性中“应用程序”构选上“使程序集com可见”复选框。3、  在项目属性中”生成”构选上”为com interop注册”复选框。4、  参考以下

SmartWan的专栏 1442

C++C#编写并且相互调用COM组件

<!-- alimama_pid="mm_10249644_1605763_4929893"; alimama_titlecolor="707070"; alimama_descolor ="CCCCCC"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="FFFFFF"; alimama_linkcolor="DADA

3737

php调用 c#c++写的com组件

php调用com组件

weixin_41915066的博客 1050

C++COM组件并用C#调用

1、以管理员身份打开vs,特别重要,否则会不成功2、新建一个c++ ATL项目,如图,全部为默认设置 3、添加一个ATL简单对象,从添加类中添加,如图 4、添加一个方法,注意是在类视图中添加,并按照下图设置,其余部分均为默认 5、然后在test.cpp文件中添加代码,生成。一个com组件就做出来了。STDMETHODIMP Ctest::Add(LONG a, LONG b, LONG

k 4861

C++调用C# com组件

C++调用C# com组件:一个完整的的小例子 分类: 【2】MFC2012-06-07 14:34 3726人阅读 评论(0) 收藏 举报 MFC 目录(?)[+]     我们知道C#开发效率是非常高的,特别是做一些漂亮的页面就更适合用它了啊.如果你开发一个桌面应用程序即想性能好点又想页面漂亮点可以考虑用C++C#一起用.反正现在Win7都

wangcg123的专栏 1101

C++C#调用COM组件

上一篇中介绍了如何编写与注册COM组件,在这一篇中将介绍如何调用COM组件 前言 com组件注册在注册表之后,我们要通过注册表连接com组件。在我们的项目中,使用CreateDispatch方法创建分发器,通过分发器建立建立和com组件的连接,进而调用com组件中的方法。 使用visual studio2013,在C++调用COM组件: 1、新建一个MFC应用程序 在弹出的窗口中选...

刻舟求剑的博客 975

C++调用C#生成的COM组件

C++调用C#生成的COM组件

weixin_43974257的博客 651

(摘)C++C#相互调用COM组件的方法简介

1、在VS2005中,C#编写DLL并使用C++调用 2、在VS2005中C#编写的COM组件,使用VC6.0调用 3、在VC6.0中编写COM组件,使用VS2005 C#调用 4、在VC6.0中编写COM组件,使用VC6.0调用 其中每个类型都写了两个程序,一个为COM组件程序,一个为C++C#相互调用COM组件调用程序 程序实现: 1、在VS2005中,C

哈哈的博客 631

C#调用C++COM组件

前一阵在工作中做项目的时候,遇到了COM组件调用和使用问题,当时研究和好一阵,才把中间的环节打通,现在写出来为大家提供方便,这里包含了四个类型: 1、在VS2005中,C#编写DLL并使用C++调用 2、在VS2005中C#编写的COM组件,使用VC6.0调用 3、在VC6.0中编写COM组件,使用VS2005 C#调用 4、在VC6.0中编写COM组件,使用VC6.0调

Sayesan的专栏 2784
上一篇: 串口通信Serial Port类C++实现
alaseven
博客等级 码龄16年 3粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值