【急】C# 调用dll 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。【100分】
我要调用VC6写的一个dll,其C++函数声明为void WINAPI AvzGetImage (unsigned short uDeviceID, unsigned char *pImage, unsigned short FingerOn)
我在C#中调用
[DllImport("AvzScanner.dll", EntryPoint="AvzGetImage")]
public static extern bool AvzGetImage(UInt32 uDeviceID, ref Byte[] pImage,UInt16 FingerOn);
怎么试都不对!!什么stringbuilder啊,什么IntPtr?总是报尝试读取或写入受保护的内存。这通常指示其他内存已损坏
------------------------------------------------------
悬赏大侠们解决! --------------------编程问答-------------------- 网上有很多方法,比如
http://wenwen.soso.com/z/q156964820.htm
http://it.china-b.com/cxsj/cs/20090902/185590_1.html
或者你参考下相关书籍 这些问题很多 具体问题具体分析^_^ --------------------编程问答-------------------- 是不是你的方法,属性,错呀 --------------------编程问答--------------------
[DllImport("AvzScanner.dll", EntryPoint="AvzGetImage")]
public static extern bool AvzGetImage(UInt16 uDeviceID, ref Byte[] pImage,UInt16 FingerOn);
第1个和第3个参数都要用UInt16 ,这样才对应C++的unsigned short
你在上面的C#声明中第1个和第3个参数不一致。 --------------------编程问答--------------------
试了,还是没用!不过很感谢!我会给你加分的! --------------------编程问答-------------------- 怎么给你们加分呢? --------------------编程问答-------------------- C#与C++的数据类型转换,网上查查 --------------------编程问答-------------------- http://www.cnblogs.com/xumingming/archive/2008/10/10/1308248.html --------------------编程问答-------------------- int len=1000;
byte[] pImage=new byte[len];
在调用AvzGetImage方法之前先分配空间,长度为len,这个要看DLL的说明文件来具体确定,不然就会出现“报尝试读取或写入受保护的内存。这通常指示其他内存已损坏”这个异常。
--------------------编程问答--------------------
这个应该不可能,因为我已经报byte设计的尽可能大了,说明书中说只有280*280,我都设为1000000了
--------------------编程问答-------------------- 晕倒,说明书是280*280,你就应该是280*280,如果设的比这个小,那你调用成功后就会缺少一部分数据,比280*280大就会出现“报尝试读取或写入受保护的内存。这通常指示其他内存已损坏”这个异常。
所以不能大也不能小,要刚好的。 --------------------编程问答-------------------- 晕,不论是我设置大还是小,都报同样的错,按照楼上的说法,设置过小的话应该可以调试通过啊!望楼上给个方法,正确了就给你100分 --------------------编程问答--------------------
[DllImport("AvzScanner.dll", EntryPoint = "AvzGetImage")]
public static extern bool AvzGetImage(UInt16 uDeviceID, IntPtr pImage, UInt16 FingerOn);
int len=280*280;
IntPtr pImage = System.Runtime.InteropServices.Marshal.AllocHGlobal(len);
UInt16 uDeviceID;
UInt16 FingerOn;
AvzGetImage(uDeviceID, pImage, FingerOn);
byte[] bytes = new byte[len];
System.Runtime.InteropServices.Marshal.Copy(pImage, bytes, 0, bytes.Length);
System.Runtime.InteropServices.Marshal.FreeHGlobal(pImage);
//bytes数组就是调用成功后的数据
这样试试 --------------------编程问答-------------------- 还是不行,哎~~~真是折磨人啊!跪求大家支点招吧!
--------------------编程问答-------------------- [DllImport("AvzScanner.dll", EntryPoint = "AvzGetImage")]
public static extern void AvzGetImage(UInt16 uDeviceID, IntPtr pImage, UInt16 FingerOn);
晕倒,前面C++是void的,你什么时候变成bool的,改成void,这样再试试。 --------------------编程问答-------------------- 不是这个问题,继续悬赏!!分不够可以加,期待大虾!!! --------------------编程问答-------------------- 有没有VC调用这个DLL的DEMO,传上来看看
补充:.NET技术 , C#