这里我们要先注意一个前提: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】,同时选择【公共语言运行时支持】: