本帖最后由 wuyiming8 于 2012-01-10 15:21:48 编辑

解决方案 »

  1.   

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
      public struct DEV_CTRL_PARAM
      {
      public int ScanType;  [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I4, SizeConst = 12)]
      public int[] SelChannel; 
      public int mParamType;
      public ptr mEtalonPeakNum;
      public intptr p_EtalonPeakVal;  
    }
      

  2.   

    public ptr mEtalonPeakNum;
    ===>public intptr  mEtalonPeakNum;
      

  3.   

    DEV_CTRL_PARAM mParam;
      mParam.SelChannel = new int[12];  int mEtalonPeakNum = 0;
      float[] EtalonPeakVal = new float[400];
      int[] temptype = new int[7] { 6, 5, 4, 3, 2, 1, 0 };
      mParam.ScanType = 3; 
      mParam.mParamType = 0;  mParam.mEtalonPeakNum = Marshal.StructureToPtr(mEtalonPeakNum, mParam.mEtalonPeakNum,true);
      mParam.p_EtalonPeakVal = UnsafeAddrOfPinnedArrayElement (EtalonPeakVal,0);

      mParam.SelChannel[0] = 1;
      mParam.SelChannel[1] = 1;
      mParam.SelChannel[2] = 1;
      mParam.SelChannel[3] = 1;
      mParam.SelChannel[4] = 1;
      mParam.SelChannel[5] = 1;
      mParam.SelChannel[6] = 1;
      mParam.SelChannel[7] = 1;
      mParam.SelChannel[8] = 1;
      mParam.SelChannel[9] = 1;
      mParam.SelChannel[10] = 0;
      mParam.SelChannel[11] = 0;Pci_InitDevice(0, ref mParam);
      

  4.   


    您好!谢谢您的解答 .mParam.mEtalonPeakNum = Marshal.StructureToPtr(mEtalonPeakNum, mParam.mEtalonPeakNum,true);
       mParam.p_EtalonPeakVal = UnsafeAddrOfPinnedArrayElement (EtalonPeakVal,0);
     整理为: Marshal.StructureToPtr(mEtalonPeakNum, mParam.mEtalonPeakNum, true);
                mParam.p_EtalonPeakVal = Marshal.UnsafeAddrOfPinnedArrayElement(EtalonPeakVal, 0);现在出现问题:
    mParam.mEtalonPeakNum  Value cannot be null. Parameter name:ptr.
      

  5.   

    DEV_CTRL_PARAM mParam= new DEV_CTRL_PARAM();
                mParam.SelChannel = new int[12];            int mEtalonPeakNum = 0;
                float[] EtalonPeakVal = new float[400];
                int[] temptype = new int[7] { 6, 5, 4, 3, 2, 1, 0 };            mParam.ScanType = 3; 
                mParam.mParamType = 0;            //IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Test)));
                Marshal.StructureToPtr(mEtalonPeakNum, mParam.mEtalonPeakNum, true);
                mParam.p_EtalonPeakVal = Marshal.UnsafeAddrOfPinnedArrayElement(EtalonPeakVal, 0);
                 mParam.SelChannel[0] = 1;
                mParam.SelChannel[1] = 1;
                mParam.SelChannel[2] = 1;
                mParam.SelChannel[3] = 1;
                mParam.SelChannel[4] = 1;
                mParam.SelChannel[5] = 1;
                mParam.SelChannel[6] = 1;
                mParam.SelChannel[7] = 1;
                mParam.SelChannel[8] = 1;
                mParam.SelChannel[9] = 1;
                mParam.SelChannel[10] = 0;
                mParam.SelChannel[11] = 0;Pci_InitDevice(0, ref mParam);