- 参考博客https://blog.csdn.net/songyi160/article/details/51075023 并增加了一些内容
- C#工程调用C++工程项目的dll需要注意C++中string类型作为传入接口的时候代码书写方式与常用方式有区别,书写方式如下
extern "C" _declspec(dllexport) int _stdcall TEST_IMAGE(char *imagename,const char* result);
函数体重的变量使用方式如下:
string outmessage;
outmessage = “testing!”
result = outmessage.c_str();
c#中书写方式如下:
[DllImport("createlprdll.dll", EntryPoint = "TEST_IMAGE", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int TEST_IMAGE(StringBuilder imagename, StringBuilder result);
static void Main(string[] args)
{
StringBuilder imagename = new StringBuilder(1024);
StringBuilder result = new StringBuilder(1024);
imagename.Append("G:\\lprdll\\img2.jpg");
int a = TEST_IMAGE(imagename,result);
}
注意:
- 需要用char* 不能使用string;
- C#中使用StringBuilder并且 赋值采用函数 Append;
3.出现问题联调时需注意 如果是C++项目在release下生产的dll 相关配置属性(主要是opencv) debug也需要配置好,因为C#在debug环境下调试,跳入C++代码后,访问的是debug模式。
4.注意传出的char* 参数 在外部申请内存 ,内部就不能再申请了!