有个项目需要用到C# 调用C++写的方法,但是调用的时候发现传入的参数变了,请高手指点,具体如下:有一个用VC 写的静态CommService.dll,对外提供了如下一个接口:
extern long __stdcall ChangeInfo(PCIPHERDATA pCD);参数PCIPHERDATA  是个结构指针,定义如下:
typedef struct _CIPHERDATA {
BYTE iVersion;
BYTE iType;    
unsigned char  szInData[150];
unsigned char  szOutData[150];
} CIPHERDATA, * PCIPHERDATA;需要在C#中调用该接口,写法如下:
    public class Import                    //引入接口
    {
        [DllImport("CommService.dll", EntryPoint = "ChangeInfo")]
        public static extern int ChangeInfo(ref CIPHERDATA data);
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct CIPHERDATA              //对应C++ 中的结构,不知道数据类型对否
    {
        public byte iVersion; 
        public byte iType; 
        public byte[] szInData;
        public byte[] szOutData;//用来保存转换后的数据
    }    //下面是调用方法             private void CallChangeValue()
         {
             CIPHERDATA cipherData = new CIPHERDATA();
             cipherData.iVersion = 0x01;
             cipherData.iType = 0x0E;
             cipherData.szInData = new byte[150];
             cipherData.szOutData = new byte[150];
             cipherData.szInData[0] = 0x1F;
             cipherData.szInData[1] = 0x1B;
             cipherData.szInData[2] = 0x0E;
             cipherData.szInData[3] = 0x00;
             cipherData.szInData[4] = 0x00;
             cipherData.szInData[5] = 0x20;
             cipherData.szInData[6] = 0x06;
             cipherData.szInData[7] = 0x12;
             cipherData.szInData[8] = 0x13;
             cipherData.szInData[9] = 0x08;
             cipherData.szInData[10] = 0x25;
             cipherData.szInData[11] = 0x20;
             cipherData.szInData[12] = 0x00;
             cipherData.szInData[13] = 0x14;
             cipherData.szInData[14] = 0x91;
             cipherData.szInData[15] = 0x93;
             cipherData.szInData[16] = 0x00;
             cipherData.szInData[17] = 0x10;
             cipherData.szInData[18] = 0x00;
             cipherData.szInData[19] = 0x00;
             cipherData.szInData[20] = 0x10;
             cipherData.szInData[21] = 0x92;
             cipherData.szInData[22] = 0x00;
             cipherData.szInData[23] = 0x67;
             int rtn = Import.Encrypt(ref cipherData);
         }问题是我在C++中跟踪该方法的调用时,用16进制查看,szInData和传入的数据不一致,请高手指点 是数据类型上有错误还是那方面有问题?

解决方案 »

  1.   

    这样定义:
    [StructLayout(LayoutKind.Sequential)] 
        public struct CIPHERDATA              //对应C++ 中的结构,不知道数据类型对否 
        { 
            public byte iVersion; 
            public byte iType;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=150)]
            public byte[] szInData; 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=150)]
            public byte[] szOutData;//用来保存转换后的数据 
        }
      

  2.   

        [StructLayout(LayoutKind.Sequential)] 
        public unsafe struct CIPHERDATA              //对应C++ 中的结构,不知道数据类型对否 
        { 
            public byte iVersion; 
            public byte iType; 
            public fixed byte szInData[150]; 
            public fixed byte szOutData[150];//用来保存转换后的数据 
        }