C#动态库调用时提示: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

dailongzhen 2014-05-31 01:49:20
这是一个动态库调用函数:
MIBDLL_API  int _stdcall mibdecode(char* array);


下面是在C#中对其调用:
 [DllImport("MibDll.dll", EntryPoint = "?mibdecode@@YGHPAD@Z")]
public static extern int mibdecode(string array);

private void button1_Click(object sender, EventArgs e)
{
string str,array;
str = textBox1.Text;
string[] substr = str.Split(new char[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries);
byte[] data = new byte[substr.Length];
for (int i = 0; i < substr.Length; i++)
{
data[i] = Convert.ToByte(substr[i], 16);

}
//string array = BitConverter.ToString(data);
//array = Encoding.Default.GetString(data);//************
array = Encoding.Unicode .GetString(data);
//textBox2.Text = array;
mibdecode(array);

}

当我使用“array = Encoding.Default.GetString(data);”(注有//**********”)时,程序能够正常调用,但编码结果与C/C++中不一样,于是我使用 “array = Encoding.Unicode .GetString(data);”,虽然编码结果一样了,但是在调用“mibdecode(array);”时,却提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。这是什么原因啊?求解!
...全文
231 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sadadi 2014-05-31
  • 打赏
  • 举报
回复
引用 6 楼 dailongzhen 的回复:
[quote=引用 2 楼 sadadi 的回复:] [quote=引用 1 楼 sadadi 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
好像搞错了.... 你少写参数了。 GetString(byte[] bytes)这个版本是不公开的, Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] 没有啊,编辑器提示的只有Encoding.Unicode .GetString(byte[] bytes);[/quote] 先调试一下 看string中是什么 编译器有问题... 你改一下试一试
dailongzhen 2014-05-31
  • 打赏
  • 举报
回复
引用 5 楼 sadadi 的回复:
[quote=引用 3 楼 dailongzhen 的回复:] [quote=引用 1 楼 sadadi 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
报错是出在”mibdecode(array);“,传的是string,与byte有什么关系呢?[/quote] 转换时出错 未接受到值[/quote] 那该怎么解决呢?
dailongzhen 2014-05-31
  • 打赏
  • 举报
回复
引用 2 楼 sadadi 的回复:
[quote=引用 1 楼 sadadi 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
好像搞错了.... 你少写参数了。 GetString(byte[] bytes)这个版本是不公开的, Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] 没有啊,编辑器提示的只有Encoding.Unicode .GetString(byte[] bytes);
sadadi 2014-05-31
  • 打赏
  • 举报
回复
引用 3 楼 dailongzhen 的回复:
[quote=引用 1 楼 sadadi 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
报错是出在”mibdecode(array);“,传的是string,与byte有什么关系呢?[/quote] 转换时出错 未接受到值
sadadi 2014-05-31
  • 打赏
  • 举报
回复
引用 2 楼 sadadi 的回复:
[quote=引用 1 楼 sadadi 的回复:] byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
好像搞错了.... 你少写参数了。 GetString(byte[] bytes)这个版本是不公开的, Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)[/quote] index 或 count 小于零。 - 或 - index 和 count 不表示 bytes 中的有效范围。 抛出异常 ArgumentOutOfRangeException
dailongzhen 2014-05-31
  • 打赏
  • 举报
回复
引用 1 楼 sadadi 的回复:
byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
报错是出在”mibdecode(array);“,传的是string,与byte有什么关系呢?
sadadi 2014-05-31
  • 打赏
  • 举报
回复
引用 1 楼 sadadi 的回复:
byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧
好像搞错了.... 你少写参数了。 GetString(byte[] bytes)这个版本是不公开的, Unicode类公开的只有下面这个。 GetString(byte[] bytes, int index, int count)
sadadi 2014-05-31
  • 打赏
  • 举报
回复
byte 的范围可能不够 然后超出了 就读取别的地方的内存 于是就: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 尝试换一个类型吧

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧