在.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. MySQL 学习三 关于转义

    DB2 LIKE谓词查询语句中支持 百分号(%).下划线(_)的使用,不支持方括号([])(注:它会把方括号当成实际的值而非通配符),当我们需要在LIKE 查询条件中将百分号(%).下划线(_)作为实 ...

  2. Hibernate 的HQL和sql有什么区别

    转自:https://blog.csdn.net/haozhugogo/article/details/54575802sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 ...

  3. 计算机网络HTTP、TCP/IP包

    参考: TCP-IP数据包结构详解 HTTP报文格式详解 Http协议报文格式 HTTP请求/响应报文结构 [Java知识]GET和POST请求的区别

  4. 4.ctf实战题

    一道ctf实战题. 先亮出网址: http://fb2ad00f-0a28-4e38-8fff-849d7391e2d0.coding.io 打开连接,看到下面页面.Web题,首先就是扫描(御剑啊还有 ...

  5. Git 时光穿梭鸡 撤销修改

    工作区内容修改了, 但是并未add到暂存区, 想 回退到上一个版本 在readme.txt中添加了一行: Git is a distributed version control system. Gi ...

  6. Ext.apply(src,apply) 和 Ext.applyIf(src,apply)比较(转)

    Ext.onReady(function(){ /* * Ext.apply(src,apply) 和 Ext.applyIf(src,apply) 两个方法的使用和区别比较 */ //Ext.app ...

  7. php 连接 memcached 并调用

    话不多说,上代码,自己看注释 <?php header("Content-type: text/html; charset=utf-8"); $mem = new Memca ...

  8. python接口测试框架遇到的坑(一)excel数字转文本

    一.遇到的问题 python编写接口测试框架中,接口用例使用excel维护,其中预期值(code码的值)20000和实际值总是不一致,后来通过打印type发现一个是unicode,一个是float. ...

  9. 设置eclipse的Maven插件引入依赖jar包后自动下载并关联相应的源码(转)

    好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名,而且不安装反编译器的情况下不能进入方法内部看具体实现 . 其实 eclip ...

  10. Delphi调用C# 编写dll动态库

    Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...