错落语言编制程序:启用CLCRUISER(公共语言运转时编写翻译)让C#调用C++

前言

有关混合C#和C++的编制程序格局,本身此前写过壹篇博客(参见错落语言编制程序:C#应用原生的Directx和OpenGL),在从前的博客中,介绍了在C#的Winform和WPF下选拔原生的Direct和OpenGL举办绘图,重要使用的办法是声称一个函数为导出函数,然后就足以在C#中选用这么些函数。

结语

本文首要记录本人在做项目中发现的难点、化解难点所利用到相关的技能,有效地解决了C#调用C++的标题。当然,其中还有好多细节并从未长远钻研,可能会设有更好的章程。

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

在努力化解各类Bug的时候猛然在一回搜索时找到了公家语言运转时编写翻译。所谓国有语言运维时编写翻译,正是同意应用程序和组件使用集体语言运维时
(CL逍客) 中的功效。找到MSDN上的有关文书档案:

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

有了公私语言运维时编写翻译,在C#程序集中就足以引用C++开发的DLL,并且使用C++的类就和利用使用C#类是千篇1律的,还足以一贯断点调节和测试,以上难题总体缓解。

高效,我就把前面用C写的代码改写成了C++的代码,启用CLPAJERO,并删掉了C#中重新的代码。

指南针难题

利用C++开发就会时不时采纳到指针,但C#尚无指针(一般景色,其实C#是有指针的,只可是私下认可被关闭了)。在C#中要传递三个指针至少有三种办法:

  1. 使用stackalloc在栈上分配内存块,这看似于C的malloc和C++的new(当然依旧有分别的),详细新闻可参考stackalloc(C#
    参考)

  2. 使用fixed语句稳定变量的指针,C#中之所以不让用指针,正是因为出于杂质回收机制会招致变量重一直,变量重平素后,此前的指针也就不再指向这么些变量了,所以C#在那种意况下是要禁用指针。而fixed 语句取缔垃圾回收珍视定位可活动的变量,并在实施该语句时期“固定”此变量。固定变量的职分后就足以采用指针了,详细音讯可参看fixed
    语句(C#
    参考)

亟待提醒的是,那三种方法都亟需在不安全的前后文中使用,关于不安全上下文,可参看unsafe(C#
参考)

留存的题材

事先的不二等秘书诀使C#调用C/C++成为或许,可是存在诸多弱点,重要呈今后偏下多少个地方:

  1. 使用extern "C" _declspec(dllexport)的注明形式只能定义C函数,不可能直接使用C++的类,功效不够有力。
  2. 参数字传送递很麻烦,越发是传播数组时,平常会出现参数类型错误或然数高管度不正确,很不利索。
  3. 亟需写重复性的代码,在C#代码中必要再度申明C/C++写的DLL中的函数,假诺在C/C++代码中定义了结构体,还索要在C#中另行注脚,处理参数类型又是3个劳神的政工。
  4. 急需手动拷贝DLL到C#程序的目录下,若是忘记拷贝了,程序在运行时会报DLL未找到的荒谬。
  5. 可怜不便宜调节和测试,不可能在C/C++代码中开始展览断点跟踪调节和测试。同时对C/C++代码修改编写翻译后,须求拷贝DLL到C#程序目录,不然C#次第调用的可能修改此前的DLL。

前段时间开发的三个应用程序中必要控制多个数采卡(SP Divece
的ADQ和SDTiggo),官方提供了C和C++的驱动,可以利用C/C++对数采卡举办控制。作者最开头仍然使用了前头宣称导出函数的秘籍开始展览付出,用C语言完成,不过随着成效的纷纷和代码的加码,上边一层层难点尤其严重。

相关文章