刚开始写C# 调用C++的DLLC++ DLL 对外接口声明如下extern "C" __declspec(dllexport) int GetSnapshotValues(int PointNum,LPCSTR strPtName[],float* fPtValue,short* iState)
在C#中使用了两种方式调用//第一种 声明
public static extern int GetSnapshotValues(int nNum, string[] StrParam,float[] ParamNum,short[] DbType);//第二种 声明
public static extern int GetSnapshotValues(int nNum, string[] StrParam,ref float[] ParamNum,ref short[] DbType);//调用
          string[] tt = { "1q", "2s", "3r", "4t", "5h" };
          float[] ffa = new float[10];
          short[] ssa = new short[10];
          //第一种调用
          int Res = GetSnapshotValues(5, tt, ffa, ssa); //可以正常执行  参数ffa, ssa取得返回值          //第二种调用
          //int Res = GetSnapshotValues(5, tt,ref  ffa, ref ssa);//参数ffa, ssa可以取得返回值 但函数执行完报错
          //"引发类型为“System.ExecutionEngineException”的异常。"
          return string.Format("success");我现在知道传递数组时传递的是引用  我想弄明白的是如果使用
第二种方式 参数ref float[] ParamNum  与与第一种float[] ParamNum 有什么不同呢?
是否可以将ref float[] ParamNum  理解为二维数组 而 float[] ParamNum 是一维的??因此引申下来 如果我在C++中使用二维数组 那么在C#中该怎么声明函数呢?  

解决方案 »

  1.   

    ref 关键字使参数按引用传递。
    当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
      

  2.   

    ref怎么可能改变数组维数.
    他只是个关键字,使参数按引用传递,好好看看msdn吧.
    http://msdn.microsoft.com/zh-cn/library/14akc2c7(v=VS.90).aspx
      

  3.   

    ref 被当做引用传递,符合c++的指针类型参数