1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 关于用C#调用C++的dll中的函数 获取字符串返回值的一些细节

关于用C#调用C++的dll中的函数 获取字符串返回值的一些细节

时间:2019-02-06 00:06:29

相关推荐

关于用C#调用C++的dll中的函数 获取字符串返回值的一些细节

这里我们要先注意一个前提:C#与C++的根本区别在于,C#是托管类语言,而C++是非托管性质的。

简单来说就是C#有垃圾回收机制帮我们做很多事情而C++没有。

因此,涉及到C#与C++混用场景的时候这种机制上的区别让两个语言之间的数据交换有着一套比较麻烦的规则。

这也是为什么后来又提出了C++/CLR这个语言,它可以将C#与C++杂糅在一起进行代码编写。

但是有的时候,尤其是当我们做二次开发的时候,很多dll库是现成的,这个时候最好就是通过调用C++dll的方式实现在C#内调用C++的函数,如果用C++/CLR的话你还得写不少的代码。

下面是具体步骤,假如说我们在C++有个函数,CPP中的源代码:

char* GetCharLen(char* input) {char* output = new char[20];strcpy(output, input);return output;}

这里有一个细节,该函数返回的output一定要在函数内使用new进行空间的申请,否则很可能在C#那边获取不到返回值(尽管C#那边不会报错,但是你拿不到这个字符串的值)。

头文件声明:

extern "C" __declspec(dllexport) char* __stdcall GetCharLen(char* input);

这里请注意头文件的声明,如果你想要在C#中调用这个函数,那就一定不要忘记加上【extern "C" __declspec(dllexport)】这个前缀。

同时,编译这段代码的项目也要做出相应地设置(这里以VS为例),首先要设置为编译dll的模式,扩展名设置为【.dll】,同时选择【公共语言运行时支持】:

然后进行编译,编译完成之后的dll放置到你的C#项目的debug目录(这里我的C++编译出的dll名字叫IFCEncodeDecode.dll):

然后在C#中添加一段代码引用这个C++函数:

[DllImport("IFCEncodeDecode.dll", EntryPoint = "GetCharLen", CallingConvention = CallingConvention.Cdecl)]public static extern IntPtr GetCharLen(string input);

这里注意了,使用DllImport需要在C#文件头加入引用:

using System.Runtime.InteropServices;

另外,DllImport后面的dll文件名不要写错,EntryPoint这个是你在C++里面声明的函数名,也不能有错误。

大家这里会注意到,C#声明的函数参数以及返回值分别是【string】和【Inptr】,而C++对应的是【char*】,这里是由于C++与C#存在一定的数据类型转换关系,大家可以自行baidu一下,这类资料很多。

然后是调用:

string plain = "序号";IntPtr b = GetCharLen(plain);Console.WriteLine(Marshal.PtrToStringAnsi(b));

这里,我们需要用IntPtr这个类型来接受返回值,然后使用一个函数将IntPtr转换为String类型才能进行显示。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。