.Net平台互操作技术:01. 主要问题
在.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. 主要问题的更多相关文章
- .Net平台互操作技术:03. 技术验证
上面两篇文章分别介绍了.Net平台互操作技术面临的问题,并重点介绍了通过P/Invoke调用Native C++类库的技术实现.光说不做是假把式,本文笔者将设计实验来证明P/Invoke调用技术的可行 ...
- .Net平台互操作技术:02. 技术介绍
上一篇文章简单介绍了.Net平台互操作技术的面临的主要问题,以及主要的解决方案.本文将重点介绍使用相对较多的P/Invoke技术的实现:C#通过P/Invoke调用Native C++ Dll技术.C ...
- 面向侧面的程序设计AOP-------《三》.Net平台AOP技术概览
本文转载自张逸:晴窗笔记 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级应用上, ...
- 品友互动大数据平台的技术演化 https://www.sohu.com/a/191202836_99982360
品友互动大数据平台的技术演化
- AOP技术介绍--(.Net平台AOP技术研究)
4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级 ...
- 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极客公园 2018-12-01
https://mp.weixin.qq.com/s/jfHFXZpzbAEbHKkCMSev6w 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极 ...
- JAVA平台AOP技术研究
3.1 Java平台AOP技术概览 3.1.1 AOP技术在Java平台中的应用 AOP在实验室应用和商业应用上,Java平台始终走在前面.从最初也是目前最成熟的AOP工具--AspectJ,到目前已 ...
- 校友信息管理&SNS互动平台之技术框架选择
前言.提纲及说明: 请移步:<校友信息管理&SNS互动平台之前言.目录及说明>(博客园地址:http://www.cnblogs.com/s6cn/p/3516876.html) ...
- Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术
今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...
随机推荐
- Selenium Webdriver元素定位
http://www.cnblogs.com/qingchunjun/p/4208159.html
- 微信公众平台:扫一扫demo
ylbtech-微信公众平台:扫一扫demo 1.返回顶部 1.Web.config <appSettings> <add key="appid" value=& ...
- 【250】◀▶IEW-Unit15
Unit 15 Youth Issues 1.model1题目分析 Young people who are still at school often feel just as much stres ...
- 【技巧】断点调试你的express项目
目录(?)[-] 写在前面 node-inspector 全局安装node-inspector 以debug模式开启express服务 启动node-inspector 调试NodeJS程序 写在 ...
- css属性学习
CSS display 属性 display 属性规定元素应该生成的框的类型. none:此元素不会被显示. block:此元素将显示为块级元素,此元素前后会带有换行符. inline默认.此元素会被 ...
- Maven 3 入门 -- 安装与配置
Maven 3 入门 -- 安装与配置 Maven以及其Eclipse插件m2eclipse的安装 (本文参考了Maven实战) 检查JDK的安装以及环境变量的配置 打开cmd echo %Java_ ...
- C# 写 LeetCode easy #1 Two Sum
1.Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...
- GO:字符串Slice后乱码问题
遇到的问题:用Slice 直接截取字符串的时候会出现乱码现象 package main import ( "fmt" ) func main() { str := "我的 ...
- Node-SASS安装
鉴于国内的环境,node-sass实在是太难安装了,可以直接通过淘宝的npm镜像来安装. 1.安装cnpm(https://npm.taobao.org/) npm install -g cnpm - ...
- Python之for循环和while循环
Python中有两种循环,分别为:for 循环和 while 循环. 循环语句就是在某种条件下,循环的执行某段代码块,并在符合条件的情况下跳出该段循环, 其目的是处理想要进行处理的相同任务.它的关键词 ...