引用了一个封装好的dll(里面的内容无法修改),调用里面的方法运行,前两次没有问题,运行三次后会提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”。测试代码如下 :      
[DllImport(@"C:\dxlapi.dll")]
        private static extern bool apiInitLibrary(string s, string ss, string sss);
        [DllImport(@"C:\dxlapi.dll")]
        private static extern bool apiFinishLibrary();
        private void button1_Click(object sender, EventArgs e)
        {
            apiInitLibrary(String.Empty, String.Empty, String.Empty);
            apiFinishLibrary();
        }
请问是什么原因,如何解决?

解决方案 »

  1.   

    路过,同情....
    引用DLL是这样么[DllImport(@"C:\dxlapi.dll")]
      

  2.   

    是的 引用非.net自身的dll或是com组件 就是用这个
      

  3.   

    试试先初始化字串再传入
    String str1 = "";
    String str2 = "";
    String str3 = "";apiInitLibrary(str1, str2, str3);
      

  4.   

    字符串的问题已经测试过了,不是它的问题。
    也就是说只有
            [DllImport(@"C:\dxlapi.dll")]
            private static extern bool apiFinishLibrary();
            private void button1_Click(object sender, EventArgs e)
            {
                apiFinishLibrary();
            }
    这个方法同样运行三次之后会出现问题。
    我觉得应该是内存分配的问题.但就是没有找到解决的办法
      

  5.   

    那个dxl没有问题 因为用vc++.net测试过 但是用c#引用就有了问题 而且还是在第三次运行才出现问题了 所以我觉得可能是c#引用dll内存分配的问题
      

  6.   

    dll是Telelogic公司全部封装好的 没法看到里面的代码 只是提供了这几个可以调用的函数
      

  7.   

    [DllImport(@"C:\dxlapi.dll")]
    不要写两次!一次加载即可
      

  8.   

    apiInitLibrary()的dll签名你肯定有塞。定义。
    看样子是字符串长度的问题。
    我遇到过。
      

  9.   

    在没有文档支持的情况下调用非C#编写的DLL是常有奇怪的问题发生,原因就是你在用别人封装好的函数,我在这里说一下个人看法:
    第一次执行apiInitLibrary(String.Empty, String.Empty, String.Empty);完成初始化。
    第二次执行完毕后变量的相关内存被损坏。
    第三次执行报告异常原因。楼主你确定一下apiInitLibrary能否被重复执行,有些初始化函数是只能执行一次的,执行多次可能会导致错误。
      

  10.   

    十分感谢 jerryfos(想飞)
    就是重复初始化的原因 
    结贴