2019独角兽企业重金招聘Python工程师标准>>>

.Net BCL 支持两种互操作技术,模块 级重用 P/Invoke 和组件级重用COM 互操作,

C++/CLI 除了支持以上两种互操作以外,更支持代码级重用, 称为 C++ Interop,本文

仅举例说明这种互操作技术。本例使用 ISO C++ 建立一个类 NativeLib, 计算并打印

两个位置的直线距离,然后使用 C++/CLI 封装在一个 NativeLibWrap 托管类里,提

供给 C# 主程序调用。

// NativeLib.h (ISO C++)

#include <iostream>

#include <cmath>

using namespace std;

public struct Location

{

Location(double x, double y) : X(x), Y(y) { }

double X;

double Y;

};

public class NativeLib

{

public:

NativeLib(Location&, Location&);

void PrintDistance() const;

private:

Location firstLocation;

Location secondLocation;

double GetDistance() const;

};

// NativeLib.cpp (ISO C++)

#include "NativeLib.h"

NativeLib::NativeLib(Location& firstLocation, Location& secondLocation) :

firstLocation(firstLocation), secondLocation(secondLocation) {

}

double NativeLib::GetDistance() const {

double dx = firstLocation.X - secondLocation.X;

double dy = firstLocation.Y - secondLocation.Y;

double distance = sqrt(dx * dx + dy * dy);

return distance;

}

void NativeLib::PrintDistance() const {

cout << "The distance is " << GetDistance() << endl;

}

以上是 ISO C++ 代码,要在为了在托管平台 下使用,定义一个包装类 NativeLibWrap,

它引用一个 NativeLib (ISO C++)对象的指针,注意一个托管 对象不能直接包含一

个本地(ISO C++)对象,只能使用指针,这是 由垃圾收集机制决定的,本地堆内存属于

非托管资源,因此 NativeLibWrap 类实现了 Dispose 模式,请参考我的另一篇博客

—— .Net Dispose 模式与 C++/CLI 确定性资源清理。

// NativeLibWrap.h (C++/CLI)

#pragma once

#include "NativeLib.h"

public value struct LocationWrap

{

LocationWrap(double x, double y) : X(x), Y(y) { }

double X;

double Y;

};

public ref class NativeLibWrap

{

public:

NativeLibWrap(LocationWrap, LocationWrap);

~NativeLibWrap();

void PrintDistance();

protected:

!NativeLibWrap();

private:

NativeLib* nativeLib;

};

// NativeLibWrap.cpp (C++/CLI)

#incude "NativeLibWrap.h"

NativeLibWrap::NativeLibWrap(LocationWrap firstLocationWrap, LocationWrap secondLocationWrap) {

Location firstLocation(firstLocationWrap.X, firstLocationWrap.Y);

Location secondLocation(secondLocationWrap.X, secondLocationWrap.Y);

this->nativeLib = new NativeLib(firstLocation, secondLocation);

}

NativeLibWrap::~NativeLibWrap() {

this->!NativeLibWrap();

}

NativeLibWrap::!NativeLibWrap() {

delete nativeLib;

}

void NativeLibWrap::PrintDistance() {

this->nativeLib->PrintDistance();

}

Compile the four files with:

cl /clr /LD NativeLibWrap.cpp NativeLib.cpp

将产生NativeLibWrap.dll

// NativeLibWrapTest.cs (C#)

internal static class NativeLibWrapTest

{

private static void Main() {

LocationWrap firstLocation = new LocationWrap(1, 1);

LocationWrap secondLocation = new LocationWrap(4, 5);

NativeLibWrap nativeLibWrap = new NativeLibWrap(firstLocation,

secondLocation);

nativeLibWrap.PrintDistance();

nativeLibWrap.Dispose();

}

}

Compile with:

csc /r:NativeLibWrap.dll NativeLibWrapTest.cs

输出NativeLibWrapTest.exe

运行, 输出The distance is 5

对于ISO C++ 自定义的struct, enum 等类型,为了在其他.Net 语言中调用,需要重新定义为

value struct (或value class), enum class 等,如果只是在C++/CLI中使用,则不需要重新定

义,因为C++/CLI 支持ISO C++ 与托管代码的混合编程。

C++/CLI 也支持在本地类型中访问托管对象,需要使用gcroot 模板,也比较简单,可以查阅MSDN

相关文档说明,本文不再缀述。

转载于:https://my.oschina.net/duluo180/blog/8498

利用 C++ Interop 封装 ISO C++ 对象, 供其他 .Net 语言使用相关推荐

  1. 利用反射自动封装成实体对象

    利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 //获取页面数据,自动封装成bean对象pu ...

  2. 利用js的闭包原理做对象封装及调用方法

    创建一个js文件,名为testClosure.js: ? 1 2 3 4 5 6 7 8 9 (function () {   function a()   {     alert('i am a') ...

  3. JavaScript函数封装,js对象

    1.函数:是封装了一段可以被重复执行调用的 一次声明,多次调用,封装就是打包 一:声明函数(1)function 声明函数的关键字,全部小写 (2)函数是做某件事情,函数名一般是动词 getSum ( ...

  4. 利用Spring框架封装的JavaMail现实同步或异步邮件发送

    利用Spring框架封装的JavaMail现实同步或异步邮件发送 作者:张纪豪 J2EE简单地讲是在JDK上扩展了各类应用的标准规范,邮件处理便是其中一个重要的应用.它既然是规范,那么我们就可以通过J ...

  5. 利用ES6-Promise()方法封装原始jsonp实现跨域请求公用方法(告别使用JQuery封装好的jsonp)

    在项目中,经常需要用到jsonp实现跨域请求,假如使用JQuery封装好的jsonp方法,是很容易实现的,缺点:需要引入JQuery库. $.ajax({url : './package.json', ...

  6. 利用Spring框架封装的JavaMail实现同步或异步邮件发送

    J2EE简单地讲是在JDK上扩展了各类应用的标准规范,邮件处理便是其中一个重要的应用.它既然是规范,那么我们就可以通过JDK遵照邮件协议编写一个邮件处理系统,但事实上已经有很多厂商和开源组织这样做了. ...

  7. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  8. 用一个中介对象来封装一系列的对象交互

    中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式又称为调停者模式,它是一种对象行为型模式. &quo ...

  9. python封装:隐藏对象中的属性或方法(三分钟读懂)

    封装:隐藏对象中的属性或方法 隐藏对象中的属性 隐藏:- 将对象的属性名,修改为一个外部不知道的名字 我们使用时,有特殊方法来处理获取(修改)对象中的属性 获取(修改)对象中的属性 需要提供一个get ...

最新文章

  1. 【解决】联想thinkpad E40 如何禁用触摸板
  2. 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数
  3. 物联网技术的发展历史及关键技术
  4. 有限元中单元节点和积分点的区别
  5. macos安装盘第三方工具制作_一步一步教你为macOS创建系统安装盘
  6. java redis 重连机制_redis在java中的客户端连接
  7. [机器学习-实战篇]Imdb数据集情感分析之贝叶斯
  8. 高数学习笔记:利用矩阵设置密码
  9. 修补工具为什么修不干净_超声波洗不干净牙齿吗?为什么还要喷砂?
  10. Linux服务器---配置apache支持用户认证
  11. 视频教程-8086汇编语言讲座-其他
  12. wps的广告怎么彻底关闭
  13. 耐得住寂寞,坐得住板凳,也是一种能力。
  14. 视频监控开发(1)——萤石云硬盘录像机SDK使用
  15. 毕业学位论文常见问题总结
  16. Kubernetes:(十八)flannel网络
  17. 如何保存meme的网页图片_Meme图片的字体用途是什么(以及如何制作它们?)
  18. java字符串String
  19. java opencv 图片处理_Java图像处理:基于OpenCV与JVM
  20. 不再需要数据线:iPhone无线充电底座

热门文章

  1. mybatis plus 日志打印_mybatis升级为mybatis-plus踩到的坑
  2. mcgs组态软件中字体如果从左到右变化_昆仑通态专题(十一):MCGS嵌入式组态软件的脚本程序...
  3. UVA10881蚂蚁
  4. 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )
  5. 【OpenGL】四、Visual Studio 2019 配置 GitHub ( 从 GitHub 上克隆项目 )
  6. 【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )
  7. HihoCoder#1509 : 异或排序(二进制)
  8. 四种Sandcastle方法生成c#.net帮助类帮助文档
  9. struts2官方 中文教程 系列一:创建一个struts2 web Application
  10. JavaScript中的静态成员