背景:用C# dllImport第三方库,使用C++写的,第三方库,大家都懂的原因,我没有C++源码,我参考网上的C++ C#类型转换系列文章,最后唯独以下代码报错,其他全部秒退。求各位大神帮帮忙,帮忙看看是什么原因,急,谢谢大家了~~
C++的调用声明
int __stdcall Dcrf_ReadCard(char *S); //读卡
C#的声明
[DllImport("LsdDcrf.dll", CallingConvention = CallingConvention.StdCall)]
public extern static int Dcrf_ReadCard(ref String Str);
测试的调用代码:
String str = "";
CardRead.Dcrf_ReadCard(ref str);
lab.Text = str.ToString();
遭遇的错误:
运行时遇到了错误。此错误的地址为 0x66fab3fc,在线程 0x365c 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
我没有C++的源码提供分析。。
[DllImport("LsdDcrf.dll", CallingConvention = CallingConvention.StdCall)]
public extern static int Dcrf_ReadCard(ref byte S);
http://blog.csdn.net/jiangxinyu/article/details/7848015
http://blog.csdn.net/biyusr/article/details/7301288
我也遇到了这种问题,求解
C#调接口:
[DllImport("\jiangning\proRFL.dll", CallingConvention = CallingConvention.StdCall)]
//int __stdcall ReadCard(uchar d12,uchar *buffData) //读取卡片
//d12 USB类型,对于proUSB固定为1
//buffData 返回的卡数据字符串
private static extern int ReadCard(int d12, ref string buffData);
调用DEMO:
string result = string.Empty;
St = ReadCard(Fusb, ref result);
只有DLL文件,没有源码
一年之后,自问自答(笑):
这里就以我问题下方,有个人的回答为例:
解决方案:
一、将入参声明为
private static extern int ReadCard(int d12, ref byte buffData)
调用时,声明足够长的数组,如
byte[] data=new byte[2048];
ReadCard(12/*示例参数*/,ref data[0]); //传入数组的第一个元素
二、入参声明为
private static extern int ReadCard(int d12, StringBuffer buffData)
这种声明,需要
StringBuffer str=new StringBuffer(2048);
/*也需要足够长的容量,然后*/
ReadCard(12/*示例*/,str);
原理:
很简单,这里相当于传入了一个 C++ 指针, 而我们声明的数组 或者 StringBuffer 就是一个指针,出现这种错误是因为 String 本身不提供修改,不可读,所以无论是 StringBuffer 还是数组,都需要申请足够的容量,让 C++ dll 将数据写入指针。这里仅仅是 C++ 需要写数据,需要这样。如果能够确定 一个DLL 函数只对传入的数据是只读的,那么能够直接将函数声明为
private static extern int ReadCard(int d12, string buffData)
也是不会错的。
博主你好我最近也在作门锁的对接用的是java,我想问一下你调用ReadCard方法时的第二个参数是你自己传进去的还是说,传了个空的字符串它会给这个参数赋值