DLL的接口如下extern "C" void  Fuc(int *A,int B,int C,int D,int E,double *F) 在函数中A,F实际上是长度为18的数组,第一个参数为输出,其他为输入。我在C#中这么写的:using System.Runtime.InteropServices;
[DllImport("****.dll")]
public static extern void Fuc(ref IntPtr A,long B,long C,long D,long E,IntPtr F);调用如下:IntPtr A=System.Runtime.InteropServices.Marshal.AllocHGlobal(72);
IntPtr F=System.Runtime.InteropServices.Marshal.AllocHGlobal(144);double[] arr=new double[18];
//arr初始化
System.Runtime.InteropServices.Marshal.Copy(ayy,0,F,18);//将数据复制到内存指针Fuc(ref A,B,C,D,E,F);//B,C,D,E,F已定义和初始化,这里省略调用后A中还是没有值,请高手指点。我应该怎么调用这个DLL

解决方案 »

  1.   

    [DllImport("****.dll")]
    public static extern void Fuc(ref int A,long B,long C,long D,long E,ref Double F);
    简单的C++指针可以直接用引用来代替
      

  2.   

    不用ref也试了,不行我之前用的数组
    [DllImport("****.dll")]
    public static extern void Fuc(ref long[] A,long B,long C,long D,long E,double[] F);调用前A还是18行,调用后反而变为1行了,并且值为0
      

  3.   

    to:  Carpathia
    这个我也试过,也不行啊,在Fuc源码中,A和F其实是个数组
      

  4.   

    extern "C" void  Fuc(int *A,int B,int C,int D,int E,double *F)
    {
    int i,j;

    for(i=B-1;i<B*C;i+=B){A[i]=D;}

    for(i=0;i<C;i++){
    for(j=0;j<B-1;j++){
    int k=i*B;
    int tmp=int(floor(A[k+B-1]*F[k+B-1]/F[k+j]));
    if(tmp<D){tmp=D;}else if(tmp>E){tmp=E;}
    A[k+j]=tmp;
    }
    }
     return ;
    }付上源码,不需全看明白,只需看看A,F是怎么用的就行。
    这种情况下应该怎么调用?
      

  5.   

    extern "C" void Fuc(int *A,int B,int C,int D,int E,double *F)
    private static extern void Fuc(IntPtr A, int B, int C, int D, int E, IntPtr F);
      

  6.   

    [DllImport("****.dll")]
    public static extern void Fuc(int[] A,int B,int C,int D,int E,double[] F);数组前面不用加ref,另外long改为int
    int[] A=new int[18];
    double[] F=new double[18];Fuc(A,B,C,D,E,F);//B,C,D,E,F已定义和初始化,这里省略
      

  7.   

    DllImport必须滴。
    有自己的结构的话。需要定义格式说明
      

  8.   

    已经解决了,应该声明如下:using System.Runtime.InteropServices;
    [DllImport("****.dll")]
    public static extern void Fuc(int[] A,int B,int C,int D,int E,double[] F);我之前把B,C,D,E声明成long型了,就总出错。下面是C#调用DLL,和VB调用DLL的参数对照,供大家参考,我就是之前在VB中调用时将原函数中定义为int型的变量声明成long型,这是正确的;到C#中再调用时就想当然了,大家引以为戒。http://blog.csdn.net/dz45693/archive/2009/09/26/4598867.aspxhttp://www.vbgood.com/article-2425.html最后非常感谢大家的帮助。