C++混合语言编程:启用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#当这种情景下是设禁止采取指针。而fixed 语句取缔垃圾回收器重定位可活动的变量,并于推行该语句期间“固定”此变量。固定变量的岗位后哪怕可采取指针了,详细信息可参看fixed
    语句(C#
    参考)。

需提醒的凡,这有限栽艺术还待以无安全之光景文中使用,关于无安全上下文,可参考unsafe(C#
参考)。

结语

本文主要记录自己以做项目中窥见的题材、解决问题所用到相关的技能,有效地缓解了C#调用C++的题目。当然,其中还有为数不少细节并从未深切研讨,可能会见存在重好的法子。