C#调用dll “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

darkarthur 2009-05-22 08:13:09
编译OK,调试时候显示的错误
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

************** 异常文本 **************
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
在 HZbox.HZjudge.DoRecognize(Byte[] byteSerializedCh, Int32 iByteNum, Int16 chDestCh, Int16& chWrittenCh, Double[] pEvalout, Int32 iENum, Int32[] state, Byte[] ch)
在 HZbox.HZjudge.Judge() 位置 I:\GoogleCode\hzapp\HZcomponent.HZbox\HZjudge.cs:行号 114


dll是C++的,是写.def的方式导出的方法
原来的声明是这样的

BOOL DoRecognize(
const unsigned char* pWriteData,
const int iDataLen,
const unsigned short iDestWChar,
unsigned short* iWrittenChar,
double* pEvalOut,
const int iENumber,
int *state,
char *cs);

用在C#里我写成了

[DllImport(@"C:\Windows\System32\RIT.dll", EntryPoint="DoRecognize")]
static extern int DoRecognize(
byte[] byteSerializedCh,
int iByteNum,
short chDestCh,
ref short chWrittenCh,
double[] pEvalout,
int iENum,
int[] state,
byte[] ch);

总觉得是不是类型错了。

另外还有一点不知道值不值得一说,
这个dll回读取txt文件的,一开始调用是文件读不到,所以我把dll读取的文件路径都改成了绝对路径,放在system32下。
然后就变成了这样的错误,请高手指教~
...全文
13449 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
PacoNiu 2012-07-31
  • 打赏
  • 举报
回复
我也遇到这个问题了,问题是DLL中的方法我没办法改,怎么解决啊~
wangjt18 2011-10-08
  • 打赏
  • 举报
回复
up 怎么解决
一路遥遥 2011-08-25
  • 打赏
  • 举报
回复
到底是怎么解决的,没看懂~OGR遇到的这个问题
my1ove 2011-08-02
  • 打赏
  • 举报
回复
同遇!!
stu_everyday 2011-07-29
  • 打赏
  • 举报
回复
我也遇到同样的问题 ~~~~~ 待解决中 ~~~~ 先在网上未找到解决的好方法啊~~~~~
小妹妹 2011-06-03
  • 打赏
  • 举报
回复
我也想知道,而且有的时候没出问题,有的时候有问题。。。
zhangrunze1200 2011-02-10
  • 打赏
  • 举报
回复
如何解决的啊?
  • 打赏
  • 举报
回复
我也遇到这样的问题了,该怎么解决啊
hequhecong126317 2010-10-09
  • 打赏
  • 举报
回复
到底怎么解决呀
sesdf 2010-09-27
  • 打赏
  • 举报
回复
我也遇到了这个问题很棘手
Yanger_xy 2010-07-16
  • 打赏
  • 举报
回复
我也遇到类似的问题了,不知道如何解决...
skyland84 2010-04-15
  • 打赏
  • 举报
回复
真不现实的做法
yjq183 2010-01-18
  • 打赏
  • 举报
回复
也用指针,使用fix试试看
qubo17510 2010-01-06
  • 打赏
  • 举报
回复
学习,并且路过。
darkarthur 2009-05-23
  • 打赏
  • 举报
回复
解决了,把组件的方法重载了一个,参数减少到最少,简单的传值就可以搞定。另外在C#里用short代替int,确保安全。最后成功了,谢谢大家的关注和帮助。
darkarthur 2009-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hikaliv 的回复:]
二者都如下改:

C/C++ code

// 注意你的编译方式改为Unicode
extern "C" __declspec(dllexport)
BOOL __stdcall DoRecognize( const unsigned char* pWriteData,
const int iDataLen, const unsigned short iDestWChar,
unsigned short* iWrittenChar, double* pEvalOut,
const int iENumber, int *state, char *cs);


C# code

// 放到你合适的目录下
[DllImport("RIT.d…
[/Quote]

现在要我改RID.dll用stdcall的方式不太现实,
另外那些指针有些是数组,有些是出参,请教可以都用ref吗?
bbb332 2009-05-22
  • 打赏
  • 举报
回复
学习了
修改一下昵称 2009-05-22
  • 打赏
  • 举报
回复
路过帮顶....up
cnzdgs 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 darkarthur 的回复:]
引用 1 楼 cnzdgs 的回复:
数组越界了吧?检查一下各个数组的大小是否符合函数的要求。

那是不是应该显示 System.OutofMemoryException
[/Quote]
如果在非托管代码中越界,访问了未分配的地址空间,就是AccessViolationException。
linmingtao 2009-05-22
  • 打赏
  • 举报
回复
UP
加载更多回复(5)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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