在.Net平台进行程序设计时,经常遇到基于Native C++,已经开发出很多类库,而现在需要用C#语言调用Native C++类库。这种情况在金融公司的量化投资部门经常发生。原因是,金融业务系统的对计算性能极其敏感,所以很多计算模块是用Native C++实现;然而用户操作界面用一般采用C#开发,理由很简单,C#开发效率确实胜过C++。本文围绕C#语言调用C++代码存在问题进行讨论。

1. C# 调用Native C++的主要问题

笔者认为C#调用C++类库的障碍主要是验证C#语言是否可以操作内存,这也是托管代码和非托管代码的本质区别。具体来讲,要解决好三个问题:

a. C#是否可以传地址给C++

b. C#与C++是否互相可读内存中的数据

c. C#与C++是否互相可写内存中的数据

下面将围绕这三个问题分系列展开讨论。首先,简单介绍C#调用C++类库的主要技术。

2. C# 调用Native C++技术

2.1 C# 调用C++常见交互技术

连接托管世界与非托管世界的交互技术主要有四种:

1. 平台调用技术:直接通过P/Invoke 调用Native C++ Dll (static extern, DllImport)

2. C++ Interop:C++/CLI Wrapper Class

3. COM Interop

4. 采用Reflection.Emit技术,直接调用Native C++

上面四种方法中,前两种方式比较适合我们的实际情况。接下来,重点介绍前两种调用方式的使用场景。

2.2 平台调用技术和C++ Interop比较

选择平台调用技术还是C++ Interop技术来与非托管代码进行交互,取决于具体的需求。下面分别列举两种技术的使用场景。

1. 平台调用技术(P/Invoke)

1) 在源代码获取不到的情况下,平台调用技术是唯一选择。

2) 非托管函数只包含blittable类型数据。

2. C++ Interop

1) 需要在托管代码中大量使用非托管函数或类。

2) 需要在托管代码中使用非托管代码的功能且对性能要求较高时。

3) 需要封送一些非常复杂的自定义数据类型以及希望获得更好的类型安全性

在金融行业,多数计算类库以Dll的方式提供。为支持C#的调用而去改变现有的源代码不是推荐的方式。所以,对于C#调用C++ Library这个Case应该更适合用平台交互技术。后续文章,笔者将详细介绍C#通过P/Invoke调用C++库的方法。

.Net平台互操作技术:01. 主要问题的更多相关文章

  1. .Net平台互操作技术:03. 技术验证

    上面两篇文章分别介绍了.Net平台互操作技术面临的问题,并重点介绍了通过P/Invoke调用Native C++类库的技术实现.光说不做是假把式,本文笔者将设计实验来证明P/Invoke调用技术的可行 ...

  2. .Net平台互操作技术:02. 技术介绍

    上一篇文章简单介绍了.Net平台互操作技术的面临的主要问题,以及主要的解决方案.本文将重点介绍使用相对较多的P/Invoke技术的实现:C#通过P/Invoke调用Native C++ Dll技术.C ...

  3. 面向侧面的程序设计AOP-------《三》.Net平台AOP技术概览

    本文转载自张逸:晴窗笔记 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级应用上, ...

  4. 品友互动大数据平台的技术演化 https://www.sohu.com/a/191202836_99982360

    品友互动大数据平台的技术演化

  5. AOP技术介绍--(.Net平台AOP技术研究)

    4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级 ...

  6. 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极客公园 2018-12-01

    https://mp.weixin.qq.com/s/jfHFXZpzbAEbHKkCMSev6w 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极 ...

  7. JAVA平台AOP技术研究

    3.1 Java平台AOP技术概览 3.1.1 AOP技术在Java平台中的应用 AOP在实验室应用和商业应用上,Java平台始终走在前面.从最初也是目前最成熟的AOP工具--AspectJ,到目前已 ...

  8. 校友信息管理&SNS互动平台之技术框架选择

    前言.提纲及说明: 请移步:<校友信息管理&SNS互动平台之前言.目录及说明>(博客园地址:http://www.cnblogs.com/s6cn/p/3516876.html) ...

  9. Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术

    今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...

随机推荐

  1. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  2. java递归demo---

    递归思想: 递归就是方法里调用自身 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 递归算法代码显得很简洁,但递归算法解题的运行效率较低.所以不提倡用递归设计程序. 在递归调用的过程中系 ...

  3. ng2中router-outlet用法

    说明:router-outlet 是应用中的路由插座,一个页面中可以使用一个或多个router-outlet 1.只使用一个router-outlet 父组件: <router-outlet&g ...

  4. win7 x64 eclipse_kepler下编译 hadoop1.1.2-celipse-plugin

    1.编译前准备 a)       下载和解压hadoop-1.1.2.tar.gz b)       下载并配置ant 2.配置 a)       进入hadoop-1.1.2\src\contrib ...

  5. phpcms换域名细节

    修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名. 进入后台设置-->站点管理,对相应的站点的域名修改为新域名. 点击后台右上角的&quo ...

  6. Coreseek 安装问题

    Ubuntu下安装coreseek mmseg出现了cannot find input file: src/Makefile.in 解决方法如下 >autoheader >automake ...

  7. Scipy的应用

    首先总体概括一下Scipy的用处 >>> #Scipy依赖于numpy>>> #Scipy提供了真正的矩阵>>> #Scipy包含的功能:最优化, ...

  8. 散列表(Hash table)及其构造

    散列表(Hash table) 散列表,是根据关键码值(Key value)而直接进行访问的数据结构.它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录 ...

  9. python 之 time模块、datetime模块(打印进度条)

    6.9 time 模块 方法 含义 备注 time.time() 时间戳 1561013092.997079 time.strftime('%Y-%m-%d %H:%M:%S %p') 结构化时间st ...

  10. python进阶03 继承

    python进阶03 继承 一.继承 课堂练习:假设你正在参与一个魔幻类角色游戏的开发,公司需要腻味这个游戏设计两个角色的类: a.剑士 属性:1.角色名:2.角色等级:3.生命值:4.攻击力 行为: ...