C#调用C++的DLL出现尝试读取或写入受保护的内存.这通常指示其他内存已损坏.

C#code[DllImport("DBAPI.dll",CharSet=CharSet.Unicode)]staticexternboolSaveExpectResul... 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++DLL
extern“C” _
BOOL _stdcall SaveExpectResult(string xmlid, string result)
展开
 我来答
百度网友1c6e06f
2014-05-06 · TA获得超过2894个赞
知道小有建树答主
回答量:695
采纳率:66%
帮助的人:655万
展开全部
C#那边的声明和使用应该没什么问题,我觉得问题出在C++这边,参数类型不应该为string类型,C#的String对应C++中的宽字符串也就是wchar_t *,应该是这样:
SaveExpectResult(wchar_t *xmlid, wchar_t *result)
然后函数内部你需要用std::string的话,在把宽字符串转为string(wcstombs这个函数可以把宽字符串转为单字节字符串)就可以了。
空雪梦见
推荐于2016-07-16 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1188万
展开全部
两边string不是同一个类型,不能通用。

C#无法正确使用C++的string类型。
C++那边应该改为const char*或者const wchar_t*
如果用前者,C#那边CharSet要改为ANSI
更多追问追答
追问
我还是这样调用另一个DLL提示无法加载模块找不到DLL是什么情况
追答
dll文件名写错了,要不就是dll文件位置放错了,
……dll文件损坏或者指令集不对的话好像不是这个错误提示
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
姬伦戢英豪
2020-06-04 · TA获得超过4086个赞
知道大有可为答主
回答量:3131
采纳率:28%
帮助的人:382万
展开全部
托管代码调用非托管时加上这句:
[StructLayout(LayoutKind.Sequential,Pack=1)]
另外你要使用句柄平台的特定类型IntPtr来接受它回返的值,用上下文可知它返回的是一个double型的指针值的函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式