文章出处:http://www.cppblog.com/free2000fly/archive/2009/03/23/77578.html

一. 关于从 C# 客户端调用 C++ 非托管代码的方法.

本文不打算叙述, 参看以下文章. 
    http://www.codeproject.com/KB/cs/cominterop.aspx

二. 关于从 C++ 客户端调用 C# 托管代码的方法.

(一). 非常直接的方法, 参看这篇文章. 
    http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx

源代码下载  http://www.cppblog.com/Files/free2000fly/cpp-call-cs.zip

(二). 我们的方法. 这里主要讲我们的方法. 这里只讲实现过程, 不讲原理.

1. C# 实现的组件 
        (1). 打开 VS 2008, 然后新建一个 C# 工程, 类型是 windows 的 class library, 工程名为 MyTestClsLib. 
             见下图  [--图1--] 

        (2). 打开 class1.cs 文件, 在 using System.Text; 语句后面添加语句
             using System.Runtime.InteropServices;

(3). 将 public class Class1 类名改为更好认的, 如 SimpleType.

(4). 在类 SimpleType 类头顶添加类接口属性 [ClassInterface(ClassInterfaceType.AutoDual)] 
             以上三步见下图  [--图2--]


        (5). 在 SimpleType 类内部添加函数. 
            public string ConvertIntToString(int n) 
            { 
                return n.ToString(); 
            }

(6). 打开工程的 AssemblyInfo.cs 文件, 将语句 
                [assembly: ComVisible(false)] 
            改为 
                [assembly: ComVisible(true)]

(7). 打开工程的 "属性(properties)" 对话框. 选中 build 选项卡, 在这一页的最下边勾选 "Register for COM interop" 检查框. 
            见下图  [--图3--]


        (8). 编译这个工程, 如果一切顺利, 将在 bin\debug\ 目录下生成目标文件 MyTestClsLib.dll 和 MyTestClsLib.tlb 文件.

至此, C# 组件开发完毕. 通过查看注册表,可以看到增添了如下内容:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}]
@="MyTestClsLib.SimpleType"

[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="both"
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"

[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32\1.0.0.0]
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"

[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\ProgId]
@="MyTestClsLib.SimpleType"

[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType]
@="MyTestClsLib.SimpleType"

[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType\CLSID]
@="{E57F961E-9925-3025-A854-AF3E4B7C0801}"

2. C++ 客户端的例子. 
        (1). 新建一个 C++ 控制台程序, 工程名字是 TestClient, 见下图  [--图4--] .


        (2). 在包含文件 stdafx.h 内添加
            #include <windows.h>
            #include <atlbase.h>

(3). 在 TestClient.cpp 文件添加如下内容. 
             #import "..\MyTestClsLib\bin\Debug\MyTestClsLib.tlb" raw_interfaces_only 
             using namespace MyTestClsLib;

(4). 随便声明一个函数并实现之, 比如 void Foo(void); 在这个函数体内就可以调用我们先前实现的 C# 组件了. 
             比如这些代码:

void Foo(void) 
            { 
                HRESULT hr = E_FAIL; 
                CComPtr<_SimpleType> spTmp; 
                hr = spTmp.CoCreateInstance(__uuidof(SimpleType)); 
                if (SUCCEEDED(hr)) 
                { 
                    CComBSTR str; 
                    spTmp->ConvertIntToString(887, &str); 
                } 
            }

(5). 然后在 main 函数里就可以调用 Foo 函数了, 调用之前记得初始化 COM 环境. 见下图 [--图5--] .


        (6). 到此, 打完收工. 现在, 就可以编译调试看看效果了. 看看 CComBSTR str 变量里是不是有了返回值 887?

例子代码下载:  http://www.cppblog.com/Files/free2000fly/cstocpptest.zip

另一个例子, 用 C++ 的 ATL 定义接口, 然后用 C# 实现接口. 然后用 C++ 客户端来调用之. http://www.cppblog.com/Files/free2000fly/com2cs-impl.zip

参考资料:
   (1) http://www.codeproject.com/KB/cs/ManagedCOM.aspx
   (2) http://www.codeproject.com/KB/COM/cominterop.aspx
   (3) http://www.codeproject.com/KB/cs/cominterop.aspx
   (4) http://blogs.msdn.com/yizhang/archive/2007/11/05/net-mscoree-dll.aspx 
   (5) http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx

打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉相关推荐

  1. linux调用windows接口,想要打通Windows和Linux的任督二脉,少不了API这层功力

    原标题:想要打通Windows和Linux的任督二脉,少不了API这层功力 每每Windows一更新,都伴随着一波又一波的高潮,从界面UI到系统布局,再到各种新功能的加入,每个版本的Windows或多 ...

  2. ASP.NET2.0打通文件图片处理任督二脉【月儿原创】

    ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.1 1.最简单的单文件上传(没 ...

  3. 《AI系统周刊》第1期:社群招新,打通智能计算软硬件“任督二脉”

    No.01 智源社区 AI系统组 A I 系  统 研究 观点 资源 活动 关于周刊 AI系统是当前人工智能领域极具现实意义与前瞻性的研究热点之一,为了帮助研究与工程人员了解这一领域的进展和资讯,智源 ...

  4. 全国“最高”的视觉竞赛,华为Atlas打通遥感图像智能分析任督二脉

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 地图是我们每天都离不开的手机应用,无论打车.外卖都离不开地图数据的支持. 地图数据又离不开遥感技术.通过飞机.无人机.卫星拍摄的大量照片应 ...

  5. 公式之美:打通复杂思维的任督二脉

    公式之美打通复杂思维的任督二脉 >>>> 很多学生讨厌公式,其实并不是讨厌某这门学科. 很多时候,只是抗拒"背诵并应用"的死板考纲要求. 因为教学任务的繁重 ...

  6. TCP的慢启动、拥塞避免、重传、快恢复乱七八糟总是记不清?11个连环问让你一次性打通任督二脉

    摘要:如果你的开发过程涉及数据传输,一直在重传.超时之类的方案里有困惑的话,不妨重新学一学可靠性最精致的TCP协议. 本文分享自华为云社区<TCP的慢启动.拥塞避免.重传.快恢复乱七八糟总是记不 ...

  7. ASP.NET2.0打通文件图片处理任督二脉[转载]

    ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.1 1.最简单的单文件上传(没 ...

  8. 【知云】第六期:数据级异地容灾如何实现?阿里云帮你打通数据的“任督二脉”...

    摘要:国家要求网络借贷信息中介机构成立两年内,应当建立或使用与其业务规模相匹配的应用级灾备设施.那么如何规划容灾设施呢?本文中阿里云架构师半农将与大家分享阿里云异地容灾解决方案. 想要看视频版?请点击 ...

  9. 理解快速排序 | 打通算法学习的任督二脉

    本文作者胡光 前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者 具体内容来自他在极客时间开设的免费公开课<常用算法 25 讲> 排序算法在工作中最常用,也是学习很多 ...

最新文章

  1. 在一般处理程序(handler)中获取session的方法
  2. Error:Unable to tunnel through proxy. Proxy returns HTTP/1.1 400 Bad Request
  3. word横向网格线设置在哪里_word排版技巧:如何防止行距随字号而改变?
  4. Top3获奖金10万,Seq2seq对话系统设计方案
  5. Rabbitmq-server-3.7.18安装完整过程
  6. 在北京如何租房比较好?
  7. 计算思维的起步 - 符号化、计算化与自动化
  8. Win10 安装 Tomcat 解压版
  9. php占市场份额,PHP 目前的市场占用率(Market Share)
  10. linux crontab修改不生效,crontab 内容修改不生效
  11. Bluetooth---蓝牙
  12. 欢迎使用CSDN-markdown编辑器12321432432
  13. nyoj 一笔画问题
  14. 漫画图解 ElasticSearch 搜索原理
  15. 树莓派/继电器DIY朴素的远程空调遥控器
  16. 【胶水语言】 Python 的混合编程
  17. kesioncms ajax分页,KesionCMS v9首次更新 修复已知BUG
  18. 虚拟主服务器是什么原因,什么是虚拟主机?
  19. xnetoe toe(tcp offload engine)测试方案与结果
  20. Spring事务使用场景

热门文章

  1. mysql sqlyog讲解_详细讲解如何用SQLyog来分析MySQL数据库
  2. java设置事务锁_事务与锁
  3. ora 所有表记录数_ORACLE中如何查找定位表最后DML操作的时间小结
  4. css怎么写链接到图片和地址
  5. android图片混淆还原,图片混淆还原1.2版本
  6. android室内地图控件,[开源] Android InDoorView 室内选位控件
  7. java xml annotation_Annotation与XML配置ID生成策略
  8. 手机发包工具_【发包工具】http多线程发包工具
  9. python小结教学_Python Str内部功能-个人课堂笔记,课后总结
  10. Java中equals()和“==”区别