C#code[DllImport("DBAPI.dll", CharSet = CharSet.Unicode)] static extern bool SaveExpectResult(string xmlid, string result); public void DownLoadFiletest() { for (int i = 0; i < mycount ; i++)//循环得到参数 { expectresult = this.dataGridViewyongli.Rows[i].Cells["预期结果"].Value.ToString();//得到每行的预期结果值 xmlid = this.dataGridViewyongli.Rows[i].Cells["脚本编号"].Value.ToString();//得到每行脚本编号 Filename = this.dataGridViewyongli.Rows[i].Cells["脚本编号"].Value.ToString();//得到每行脚本编号 Url = this.dataGridViewyongli.Rows[i].Cells["脚本路径"].Value.ToString();//得到每行脚本路径名称 Urlstring = "192.168.1.39/xampp/zentao/www/data/upload/1/201404"+Url+""; Form2.SaveExpectResult(xmlid, expectresult);}C++DLLextern“C” _BOOL _stdcall SaveExpectResult(string xmlid, string result)
C#那边的声明和使用应该没什么问题,我觉得问题出在C++这边,参数类型不应该为string类型,C#的String对应C++中的宽字符串也就是wchar_t *,应该是这样:SaveExpectResult(wchar_t *xmlid, wchar_t *result)然后函数内部你需要用std::string的话,在把宽字符串转为string(wcstombs这个函数可以把宽字符串转为单字节字符串)就可以了。
两边string不是同一个类型,不能通用。C#无法正确使用C++的string类型。C++那边应该改为const char*或者const wchar_t*如果用前者,C#那边CharSet要改为ANSI 追问 我还是这样调用另一个DLL提示无法加载模块找不到DLL是什么情况 追答 dll文件名写错了,要不就是dll文件位置放错了,……dll文件损坏或者指令集不对的话好像不是这个错误提示 追问 还有就是调用时一会提示内存破坏一会提示参数无效。。。。
托管代码调用非托管时加上这句:[StructLayout(LayoutKind.Sequential,Pack=1)] 另外你要使用句柄平台的特定类型IntPtr来接受它回返的值,用上下文可知它返回的是一个double型的指针值的函数。