[COM Interop学习小结]实现一个C#调用C++的示例
最近在研究产品的架构代码,发现其中涉及到Com组件技术,即项目中的C# Project会通过Com接口来调用C++ Project中的方法,研究一下,实现一个小的例子,供自己学习。
一. 什么是COM Interop?
COM Interop 是一种让 .NET Framework 的程序能够和 COM 的程序相互操作的一种桥接技术[维基百科]。它可以让 .NET Framework 的程序使用 COM 组件,也可以让 COM 程序使用 .NET Framework 的组件。例如像我们的产品中,它可以让C#去调用C++的方法,C++去调用C#的方法。
这里涉及到一个概念,COM组件,COM技术是开发组件的一种,COM标准由微软定义,COM组件可以是一个动态连接库(DLL), 被称为进程内组件(in-of-process component),也可以是一个可执行程序(EXE),被称为进程外组件(out-of-process component)。COM对象是建立在二进制可执行代码级的基础上,而C++等语言中的对象是建立在源代码级基础上的,因此COM对象是语言无关的。
这一特性使用不同编程语言开发的组件对象进行交互成为可能。
这里我们讨论其中一个简单例子:C#调用C++代码中的方法。
二. 示例步骤:
简单说明,这里COM组件由ATL COM开发,IDE为Visual Studio 2005,步骤如下:
1. 实现一个简单的ATL COM服务器
A. 创建一个新的Visual C++ ATL 项目,名字:MyComServer。
B. 向MyComServer中添加一个新类,这里为了开发方便,推荐使用IDE的add->class,选择ATL Simple Object,名字:MyTest,可看到IDE自动为我们生成一个COM Class CMyTest。
C. 在类视图中,为MyTest的接口添加方法,名字:DoSomething,其他默认,生成后可以根据需要添加DoSomething的方法内容。
这时IDE已经为我们做了很多工作,可看到CMyTest的声明如下:
class ATL_NO_VTABLE CMyTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyTest, &CLSID_MyTest>,
public IDispatchImpl<IMyTest, &IID_IMyTest, &LIBID_MyComServerLib, /*wMajor =*/ , /*wMinor =*/ >
{
public:
CMyTest()
{
} DECLARE_REGISTRY_RESOURCEID(IDR_MYTEST) BEGIN_COM_MAP(CMyTest)
COM_INTERFACE_ENTRY(IMyTest)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
} void FinalRelease()
{
} public:
STDMETHOD(DoSomething)(void);
};
DoSomething方法的实现如下:
STDMETHODIMP CMyTest::DoSomething(void)
{
// TODO: Add your implementation code here wprintf_s(_T("Hello, I'm here!")); return S_OK;
}
2. 使用 Tlbimp 转换 COM DLL
现在有了 COM DLL,让我们来看看如何从一个托管客户端访问它。打开 Visual Studio 命令提示,然后转到创建 COM DLL 的目录。现在运行以下命令:
tlbimp MSDNCOMServer.dll

using System;
using System.Collections.Generic;
using System.Text;
using MyComServerLib; namespace MyComClient
{
class Program
{
static void Main(string[] args)
{
MyTestClass test = new MyTestClass();
test.DoSomething();
}
}
}
执行此C#程序,即可看到"Hello, I'm here!"的输出信息,证明调用成功!!
三. 小结
由于时间有限,昨天开始研究COM Interop,到今晚刚刚实现一个成功的例子,对COM技术的认识肯定还有很多问题,这里做下总结,也希望以后能继续完善。
在两天的时间里,上网找到了很多很好的参考资料,如下:
1. 示例实现主要参考的文章
http://msdn.microsoft.com/zh-cn/magazine/cc163494.aspx
2. Understanding Classic COM Interoperability With .NET Applications
http://www.codeproject.com/Articles/990/Understanding-Classic-COM-Interoperability-With-NE
3. COM组件简介
http://www.cppblog.com/3522021224/archive/2007/06/22/26803.html
4. RCW的介绍
http://www.blogjava.net/davidgw/archive/2007/07/25/132240.html
对于COM Interop技术,自己已经有了初步了解,有助于自己更加了解项目中的COM应用。
明天可以进入下一个学习阶段啦,开始Adapter的学习!加油!晚安:-)
Best Regards
Kevin Song
[COM Interop学习小结]实现一个C#调用C++的示例的更多相关文章
- 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
- 插头$DP$学习小结
插头\(DP\)学习小结 这种辣鸡毒瘤东西也能叫算法... 很优秀的一个算法. 最基本的适用范围主要是数据范围极小的网格图路径计数问题. 如果是像\(Noi2018\)那种的话建议考生在其他两道题难度 ...
- AJAX学习小结
12345678910 $.ajax({ "url":"", //访问路径 "data":"", // 需要传输的数据 ...
随机推荐
- tftp简单文件传输协议搭建
TFTP 简单文件传输协议 安装 sudo apt-get install tftp tftpd openbsd-inetd 需要tftp tftpd openbsd-ine ...
- atcoder 2579
You are taking a computer-based examination. The examination consists of N questions, and the score ...
- Spring注解实现定时功能以及Quartz定时器
一:Spring注解实现--------->Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz 1:maven配置: <!-- quartz--> <d ...
- winfom实现关闭后一直运行
using PLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.L ...
- C语言编程思想
模块化的思想 模块化程序的特点:单入口.单出口 基本的三种结构:顺序.分支(选择).循环: 这三个基本结构来安排模块执行的步骤: 循环三要素:初值.条件.更新: 面对编程问题:三步走策略(输入+处理+ ...
- Educational Codeforces Round 3 B
B. The Best Gift time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- SQL SERVER数据库 三种 恢复模式
SQL SERVER 2005 以后三种恢复模式: 简单(Sample),完全(Full),大批量(Bulk_Logged) 完全备份模型 完全备份模式是指在出现数据文件毁坏时丢失数据的风险最小.如果 ...
- TCP/IP协议中几个缩写词的含义 MSL、TTL和RTT 报文最大生存时间 跳数(即生存时间) cs往返时间 MSL要大于TTL知道为什么吗?
MSL.TTL和RTT简介 1.MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃.因为 ...
- cesm1_2_2在南信大大型机上的移植以及运行简单case的步骤
真实验证有效:点击链接 查看具体移植过程.
- 关于KEIL下的图形化显示和输出问题
一 keil自带的虚拟示波器:只能在软件仿真下使用:右边的这个可以查看变量. 二 SEGGER的工具软件: 1 RTT:可以进行日志输出调试信息输出,需要配置工程,但不占用串口. 2 JSCOPE:可 ...