读书人

C#调用dll “尝试读取或写下受保护的内

发布时间: 2012-08-29 08:40:14 作者: rapoo

C#调用dll “尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
编译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的方式导出的方法
原来的声明是这样的

C/C++ code
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#里我写成了
C# code
[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下。
然后就变成了这样的错误,请高手指教~

[解决办法]
数组越界了吧?检查一下各个数组的大小是否符合函数的要求。
[解决办法]
二者都如下改:

C/C++ code
// 注意你的编译方式改为Unicodeextern "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);
[解决办法]
类型问题
参考
[解决办法]
也用指针,使用fix试试看
[解决办法]
探讨
引用:
数组越界了吧?检查一下各个数组的大小是否符合函数的要求。

那是不是应该显示 System.OutofMemoryException

读书人网 >C#

热点推荐