混语言编程:启用CLR(公共语言运行时编译)让C#调用C++

前言

关于混合C#跟C++的编程方式,本人之前写了千篇一律首博客(参见混语言编程:C#采取原生的Directx和OpenGL),在事先的博客中,介绍了以C#的Winform和WPF下用原生的Direct和OpenGL进行绘图,主要采用的主意是宣称一个函数为导出函数,然后便足以于C#遭受应用这函数。

存的题目

事先的法使C#调用C/C++成为可能,但是在许多弱点,主要呈现在以下几独面:

  1. 使用extern "C" _declspec(dllexport)的宣示方式只能定义C函数,无法直接利用C++的好像,功能不够有力。
  2. 参数传递很烦,尤其是流传数组时,经常会面出现参数类型错误或频繁组长度不正确,很不利索。
  3. 亟待写重复性的代码,在C#代码中要更声明C/C++写的DLL中的函数,如果以C/C++代码中定义了结构体,还亟需以C#未遭再度声明,处理参数类型又是一个劳神的工作。
  4. 得手动拷贝DLL到C#次第的目录下,如果忘记拷贝了,程序于运转时会见报DLL未找到的谬误。
  5. 大不便利调试,无法在C/C++代码中开展断点跟踪调试。同时针对C/C++代码修改编译后,需要拷贝DLL到C#先后目录,否则C#次第调用的要修改前的DLL。

前段时间开发的一个应用程序中要控制两只数采卡(SP Divece
的ADQ和SDR),官方提供了C和C++的驱动,可以采取C/C++对数采卡进行支配。我最开始还是利用了之前扬言导出函数的办法展开开发,用C语言实现,但是趁功能的错综复杂和代码的增多,上面一样多重问题更是重。

发现新陆地(公共语言运行时编译)

以斗争解决各种Bug的时段猛然在平等蹩脚寻时找到了公共语言运行时编译。所谓国有语言运行时编译,就是容应用程序和组件使用公共语言运行时
(CLR) 中的功效。找到MSDN上的系文档:

  1. /clr(公共语言运行时编译)。
  2. 掺杂(本机和托管)程序集。
  3. 如何:使用 /clr 编译 MFC 和 ATL
    代码。

发矣集体语言运行时编译,在C#先后集中就好引用C++开发的DLL,并且动用C++的切近就同用使用C#类似是同样的,还得一直断点调试,以上问题总体化解。

高速,我便将之前用C写的代码改写成了C++的代码,启用CLR,并删掉了C#中还的代码。

指南针问题

使C++开发就会常以及指针,但C#不曾指针(一般情况,其实C#大凡发指针的,只不过默认为关闭了)。在C#惨遭一经传递一个指针至少有点儿栽办法:

  1. 使用stackalloc当栈上分配内存块,这好像于C的malloc和C++的new(当然还是时有发生分之),详细信息可参看stackalloc(C#
    参考)。

  2. 使用fixed语句定点变量的指针,C#受因故未给用指针,就是因由垃圾回收机制C语言会招致变量重一贯,变量重一贯后,之前的指针也就是不再依赖于此变量了,所以C#在这种状态下是一旦禁止行使指针。而fixed 语句不准垃圾回收器重定位可走的变量,并在实行该语句期间“固定”此变量。固定变量的位置后就是得利用指针了,详细信息可参看fixed
    语句(C#
    参考)。

欲提醒的是,这半栽办法还需要在非安全之左右文中使用,关于无安全及下文,可参考unsafe(C#
参考)。

结语

正文主要记录自己当开项目遭到窥见的问题、解决问题所下到相关的技巧,有效地化解了C#调用C++的题材。当然,其中还有众多细节并没有深入研讨,可能会见有重新好的点子。