温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

启用CLR让C#调用C++存在哪些问题

发布时间:2021-11-24 13:44:29 来源:亿速云 阅读:303 作者:iii 栏目:大数据

这篇文章主要介绍“启用CLR让C#调用C++存在哪些问题”,在日常操作中,相信很多人在启用CLR让C#调用C++存在哪些问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”启用CLR让C#调用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(当然还是有区别的)。

  2. 使用fixed语句固定变量的指针,C#中之所以不让用指针,就是因为由于垃圾回收机制会导致变量重定位,变量重定位后,之前的指针也就不再指向这个变量了,所以C#在这种情况下是要禁止使用指针。而fixed 语句禁止垃圾回收器重定位可移动的变量,并在执行该语句期间“固定”此变量。固定变量的位置后就可以使用指针了。

到此,关于“启用CLR让C#调用C++存在哪些问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI