有个项目需要用到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和传入的数据不一致,请高手指点 是数据类型上有错误还是那方面有问题?
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和传入的数据不一致,请高手指点 是数据类型上有错误还是那方面有问题?
[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;//用来保存转换后的数据
}
public unsafe struct CIPHERDATA //对应C++ 中的结构,不知道数据类型对否
{
public byte iVersion;
public byte iType;
public fixed byte szInData[150];
public fixed byte szOutData[150];//用来保存转换后的数据
}