C#调用C编写的dll需要注意的几个问题
1.C语言编写dll
参考链接http://blog.csdn.net/qq759981398/article/details/8007791
2.调用dll返回值的类型
一般情况下无返回值或者返回int类型,当需要返回字符串时候,并且调用函数的参数也是字符串,通过以下方法实现:
char buff[50]; char buff_single[5]; char* __stdcall ReturnString(char* pFile) { char addre[100]; strcpy(addre,pFile);//字符串参数 strcat(buff,buff_single);//追加字符 return buff; }
[DllImport("D:\\PicRec.dll", EntryPoint = "ReturnString", CharSet = CharSet.None)] public static extern IntPtr ReturnString(string str); public string Main(String inputStr) { string str= ""; Bitmap bmp = new Bitmap(inputStr);//读取图片 bmp.Save("D:\\test.bmp", ImageFormat.Bmp);//转存 IntPtr intPtr = new IntPtr(); intPtr = ReturnString(inputStr);//调用dll函数,识别结果 str1 = Marshal.PtrToStringAnsi(intPtr); return str; }
3.C编写dll指针释放问题。
二级指针的释放:
int **a;//二维数组 a=(int**)malloc(n*sizeof(int*)); for(i=0;i<n;i++) a[i]=(int*)malloc(m*sizeof(int)); for(i=0; i<n; i++) { free(a[i]); } free(a);
当调用函数返回值是指针的时候,那么最后指针是如何释放的?(关于内存泄露,我也还不太明白)
为了避免这个问题,我采用的是将结果写入txt文件中,再让C#去文件中读取。