C语言掺杂语言编制程序:启用CL福睿斯(公共语言运营时编写翻译)让C#调用C++

前言

关于混合C#和C++的编制程序情势,自己在此以前写过壹篇博客(参见掺杂语言编程:C#选取原生的Directx和OpenGL),在后面包车型客车博客中,介绍了在C#的Winform和WPF下使用原生的Direct和OpenGL举办绘图,首要利用的诀借使声称1个函数为导出函数,然后就足以在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和SD昂Cora),官方提供了C和C++的驱动,能够利用C/C++对数采卡实行支配。作者最起头如故选用了事先扬言导出函数的诀要展开开发,用C语言达成,可是随着功用的错综复杂和代码的扩张,上边壹三种题材尤为严重。

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

在加油化解种种Bug的时候突然在2回搜索时找到了公物语言运维时编写翻译。所谓国有语言运转时编写翻译,正是允许应用程序和零部件使用集体语言运行时
(CL宝马X5) 中的效率。找到MSDN上的连锁文书档案:

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

有了集体语言运维时编写翻译,在C#次第集中就可以引用C++开发的DLL,并且应用C++的类就和利用使用C#类是一律的,还能直接断点调节和测试,以上问题总体缓解。

飞速,作者就把在此以前用C写的代码改写成了C++的代码,启用CLLX570,并删掉了C#中又一次的代码。

指南针难题

采纳C++开发就会时时使用到指针,但C#并未有指针(1般意况,其实C#是有指针的,只可是暗中认可被关门了)。在C#中要传送贰个指南针至少有三种方法:

  1. 使用stackalloc在栈上分配内存块,那好像于C的malloc和C++的new(当然依然有分其余),详细消息可参考stackalloc(C#
    参考)

  2. 使用fixed语句一向变量的指针,C#中之所以不让用指针,正是因为出于垃圾堆回收机制会造成变量重一直,变量重一直后,此前的指针也就不再指向这几个变量了,所以C#在那种情状下是要禁止利用指针。而fixed 语句不准垃圾回收重视定位可活动的变量,并在执行该语句时期“固定”此变量。固定变量的岗位后就能够动用指针了,详细音信可参考fixed
    语句(C#
    参考)

内需提醒的是,那三种形式都亟待在不安全的内外文中使用,关于不安全上下文,可参照unsafe(C#
参考)

结语

正文重要记录自身在做项目中窥见的题材、消除难题所利用到有关的技巧,有效地消除了C#调用C++的标题。当然,在那之中还有众多细节并从未深刻钻研,也许会设有更好的艺术。