日期:2014-05-18  浏览次数:20975 次

c#中遇到“尝试读取或写入受保护的内存”错误(100分)
在调用c++编写的dll(中文分词系统的dll)时遇到“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的错误
这个dll就是那个很牛X的中科院中文分词系统的ICTCLAS30.dll,还是先看代码:
  dll中的原型为:
  1)、void ICTCLAS_ParagraphProcessAW(int nCount,result_t * result);//得到分词结果,如“北京欢迎您”被分为result[0]:北京,result[1]:欢迎,result[2]:您
  2)、int ICTCLAS_KeyWord(result_t * resultKey, int &nCountKey);//得到result中的weight权重(分词词典中查询可得到权重)                                 
  这其中的result_t是一个结构,c#中定义为:
  
C# code

   public struct result_t
    { 
         [FieldOffset(0)] public int start; 
         [FieldOffset(4)] public int length;
              [FieldOffset(8)] public int sPos;
              [FieldOffset(12)] public int sPosLow;
              [FieldOffset(16)] public int POS_id; 
         [FieldOffset(20)] public int word_ID;
              [FieldOffset(24)] public int word_type;
              [FieldOffset(28)] public int weight;//这些是用来放一个词如“欢迎”的各种特点,上面所说的
                            //ICTCLAS_KeyWord功能是得到词的weight即权重
    }

 

我的调用为:
C# code

[DllImport(path,CharSet=CharSet.Ansi,EntryPoint="ICTCLAS_ParagraphProcessAW")]
        static extern void ICTCLAS_ParagraphProcessAW(int nCount, [ Out,MarshalAs(UnmanagedType.LPArray)] result_t[] result);//

        [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "ICTCLAS_KeyWord")]
        static extern int ICTCLAS_KeyWord([Out, MarshalAs(UnmanagedType.LPArray)] result_t[] result, int nCount);


 

这上面第一个函数ICTCLAS_ParagraphProcessAW用这样的参数都可以运行正常,为什么第二个keyword参数就不能运行正常了?
得到了如标题所示的异常?
各位大神帮着给解决一下

------解决方案--------------------
其中一个错误:

c++ int &nCountKey => c# ref int nCount
------解决方案--------------------
#2楼 得分:0回复于:2009-09-29 10:39:45

其中一个错误: 

c++ int &nCountKey => c# ref int nCount 


这个不重要,我调用的时候int &nCountKey 全部都直接用int的,出现这个错,还有可能是传进去的值不对,不一定就是类型不对,我在调用的时候就出现过传进去的值超过了它本身的定义的一个范围也会报这个错。。。LZ仔细检查下是不是值越界了或者是为空,还有一个可能就是它的C++dll文件本身就有错。。。