用.net调用非托管dll出现错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。c#和vb.net都试过 代码如下: 声明: 
[DllImport("refprop.dll", CharSet = CharSet.Auto)] 
public static extern unsafe void SETUPdll(int i, string hfld, string hfmix, string hrf, double ierr, string herr, int ln1, int ln2, int ln3, int ln4); 调用:   int i, nc = 1; 
hfld="nitrogen.fld"; 
  hfmix="hmx.bnc"; 
  hrf="DEF"; 
  int ierr=0; SETUPdll(nc, hfld, hfmix, hrf, ierr, herr, 10000, 255, 3, 255); 运行到这就报错上面的内存错误。 但是我在vb6.0调用的时候 完全没问题。 vb6.0的代码: 声明: 
Public Declare Sub SETUPdll Lib "REFPROP.DLL" (i As Long, ByVal hfld As String, ByVal hfmix As String, ByVal hrf As String, ierr As Long, ByVal herr As String, ln1 As Long, ln2 As Long, ln3 As Long, ln4 As Long) 调用: Sub Example() 
  Dim i As Integer 
  nc = 1 
  hfld = "nitrogen.fld"   hfmix = "hmx.bnc" 
  hrf = "DEF" 
  Call SETUPdll(nc, hfld, hfmix, hrf, ierr, herr, 10000&, 255&, 3&, 255&) end sub 
请高人解答,多谢了。 

解决方案 »

  1.   

    VB里的LONG是多长,4字节吗?(我不记得了)还有一个是double类型,这个肯定不是int的4个字节吧/你的函数的签名有问题。 
    试着修改一下签名看看,把VB里为doube的对应C#下改为double看看。
      

  2.   

    说错了,是把C#中的那个double也改为int看看。
      

  3.   

    多谢lz的。我改为:public static extern unsafe void SETUPdll(ref long i, string hfld, string hfmix, string hrf, ref long ierr, string herr, long ln1, long ln2, long ln3, long ln4);也不行,不知道是否该用ref??c写的例子里,是:
    typedef void (__stdcall *fp_SETUPdllTYPE)(long &,char*,char*,char*,long &,char*,long ,long ,long ,long );
      

  4.   

    有byval的,不需要用ref。
      

  5.   

    我用vb6.0、c 调用都没有问题,tmd就是.net调用时出错气死我了
      

  6.   

    恩是。在C的声明中用了long&的(等同在VB中不带By Val前缀的)在C#中你要用ref int。在C中直接是long(等同在VB中是by val xx as long)的在C#中是int。
      

  7.   

    to:phy我按照你上面说的做了  改c#ref int。仍然报同样的错误。
    代码如下:声明:
     [DllImport("refprop.dll", CharSet = CharSet.Auto)]
            public static extern unsafe void SETUPdll(ref int i, string hfld, string hfmix, string hrf, ref  int ierr, string herr, int ln1, int ln2, int ln3, int ln4);  调用:
    int ierr=0, nc = 1;
    hfld="nitrogen.fld";
    hfmix="hmx.bnc";
    hrf="DEF";SETUPdll(ref nc, hfld, hfmix, hrf, ref ierr, herr, 10000, 255, 3, 255);