我用C#调用C++的动态库,需要把一个结构体传进去,
C++中的结构体是这样的,struct t_DevReturn
{
int iLogicCode; // 逻辑错误码
int iPhyCode; // 物理错误码;
int iHandle; // 处理方法:0-不处理 1-初始化 2-重发命令
int iType; // 错误类型:0-警告 1-严重
char acDevReturn[128]; // 硬件返回信息
char acReserve[128]; // 保留信息
};我在c#中定义同样的结构体
        public struct t_DevReturn
        {
            public int iLogicCode; // 逻辑错误码
            public int iPhyCode; // 物理错误码;
            public int iHandle; // 处理方法:0-不处理 1-初始化 2-重发命令
            public int iType; // 错误类型:0-警告 1-严重            [MarshalAs(UnmanagedType.LPStr, SizeConst = 128)]
            public string acDevReturn; // 硬件返回信息              [MarshalAs(UnmanagedType.LPStr, SizeConst = 128)]
            public string acReserve; // 硬件返回信息  
        };
可是程序调用DLL文件的时候就直接崩溃,是不是我定义的有问题,还是其他原因,等高手。

解决方案 »

  1.   

    这样试试呢[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
        struct MyStruct
        {
            public int iLogicCode; // 逻辑错误码
            public int iPhyCode; // 物理错误码;
            public int iHandle; // 处理方法:0-不处理 1-初始化 2-重发命令
            public int iType; // 错误类型:0-警告 1-严重        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string acDevReturn; // 硬件返回信息           [MarshalAs(UnmanagedType.LPStr, SizeConst = 128)]
            public string acReserve; // 硬件返回信息   
        }
      

  2.   

    正确做法:   [StructLayout(LayoutKind.Sequential)] 
        struct MyStruct
        {
            public int iLogicCode; // 逻辑错误码
            public int iPhyCode; // 物理错误码;
            public int iHandle; // 处理方法:0-不处理 1-初始化 2-重发命令
            public int iType; // 错误类型:0-警告 1-严重        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string acDevReturn;         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string acReserve;
        }
    "调用DLL文件的时候就直接崩溃",还有可能是你API定义有问题,你一起贴出来
      

  3.   

    1和2楼的做法是正确的。
    如果这样不行的话,检查下dll是否有问题。