关于用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)】这个前缀。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值