问题描述
我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下
解决方案
解决方案二:
char[]->byte[]
解决方案三:
引用楼主a6624624的回复:
...int__stdcalltransCard(char*strReq,char*strResp);...
你完全可以指责C++部分:)因为它没有清楚约定进出关系,没有缓冲区长度指示。你的错误很可能是缓冲溢出造成的。
解决方案四:
引用楼主a6624624的回复:
我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下
看错误提示像是写出界了,如果char*不需要返回,使用string来对应;如果需要返回值,使用stringbuilder来对应,当然使用stringbuilder需要自己初始化大小。可以在c++代码中添加日志信息,核对是否有特殊的字符不定期的出现
解决方案五:
引用1楼crystal_lz的回复:
char[]->byte[]
这样声明:publicstaticexterninttransCard(byte[]strReq,byte[]strResp);??跟CallingConvention设置没关系?关于这2个参数我解释下,strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示。在C#中,这样调用:TransCard(strReq.ToString().ToCharArray(),btStrResp)C#中参数定义如下privateStringBuilderstrReq=null;byte[]btStrResp=newbyte[1024];
解决方案六:
解决方案七:
解决方案八:
解决方案九:
解决方案十:
解决方案十一:
解决方案十二:
解决方案十三:
解决方案十四:
解决方案十五:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
然后在网上看到资料关于C++和C#的参数类型对照表:http://my.oschina.net/u/216751/blog/178834//c++:char*----c#:string//传入参数//c++:char*----c#:StringBuilder//传出参数
解决方案:
引用3楼xian_wwq的回复:
Quote: 引用楼主a6624624的回复:
我的C++导出函数:int__stdcalltransCard(char*strReq,char*strResp);我C#里的导入代码:[DllImport("api.dll",EntryPoint="transCard")]publicstaticexterninttransCard(char[]strReq,byte[]strResp);调用transCard运行十几次,必定会出现如下如下错误:"运行库遇到了错误。此错误的地址为0x79ef067e,在线程0xe58上。错误代码为0xc0000005。此错误可能是CLR中的bug,或者是用户代码的不安全部分或不可验证部分中的bug。此bug的常见来源包括用户对COM-interop或PInvoke的封送处理错误,这些错误可能会损坏堆栈。"transCard返回的字符都是能正确识别的。搞了搞几天了,一天头绪都没有。网上说是参数字符数组,函数约定调用的问题,求大牛指点下看错误提示像是写出界了,如果char*不需要返回,使用string来对应;如果需要返回值,使用stringbuilder来对应,当然使用stringbuilder需要自己初始化大小。可以在c++代码中添加日志信息,核对是否有特殊的字符不定期的出现
strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示
解决方案:
引用4楼a6624624的回复:
Quote: 引用1楼crystal_lz的回复:
char[]->byte[]这样声明:publicstaticexterninttransCard(byte[]strReq,byte[]strResp);??跟CallingConvention设置没关系?关于这2个参数我解释下,strReq是我填充传入的,strResp是等C++填充字符然后C#这边解析然后显示。在C#中,这样调用:TransCard(strReq.ToString().ToCharArray(),btStrResp)C#中参数定义如下privateStringBuilderstrReq=null;byte[]btStrResp=newbyte[1024];
解决方案:解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
解决方案:
然后在网上看到资料关于C++和C#的参数类型对照表:http://my.oschina.net/u/216751/blog/178834//c++:char*----c#:string//传入参数//c++:char*----c#:StringBuilder//传出参数
在c、c++中char是一个字节的C#中的char是两个字节类型什么的只是编程中的一个约束就算是你写成intIntPtr都行这都不重要重要的是你实际传入的是什么数据这个数据是[in]还是[out]更具这些条件来确定自己使用什么类型或许你上面的可以用string也可以用stringbuilder当时不知道你具体功能的情况下byte[]肯定是万能的因为所有数据都可以转成byte[]
解决方案:
引用2楼Forty2的回复:
Quote: 引用楼主a6624624的回复:
...int__stdcalltransCard(char*strReq,char*strResp);...你完全可以指责C++部分:)因为它没有清楚约定进出关系,没有缓冲区长度指示。你的错误很可能是缓冲溢出造成的。
int__stdcalltransCard(char*strReq,char*strResp);这里应该是约定了吧?strReq是进入C++strResp是C++传出