代码之家  ›  专栏  ›  技术社区  ›  Graviton

封送C++JigGrand数组给出“无效托管/非托管类型组合”错误

  •  1
  • Graviton  · 技术社区  · 6 年前

    这是我的C++定义:

    typedef struct _DRIVER_VERSION
    {
    DWORD DriverNum;
    CHAR Version[16][16];
    } DRIVER_INFO, *PDRIVER_INFO;
    

    THSI是我的C interop代码:

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct Version16
    {
        [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string VerInfo;
    }
    
    
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct _DRIVER_VERSION
    {
        public System.UInt32 DriverNum;
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
        public Version16 Version16;
    
    }
    
        public static class InstallDeviceClass
    {
        [DllImport(@"driver.dll")]
        public static extern SResultEnum s4drv_GetDriverInfo(ref _DRIVER_VERSION pDrvInfo);
    }
    
        static void Main(string[] args)
        {
            _DRIVER_VERSION version=new _DRIVER_VERSION();
            var s4Res = InstallDeviceClass.s4drv_GetDriverInfo(ref version);
        }
    

    但是,当我运行代码时,我会

    $exception“无法封送类型为”version16“的字段 “_driver_version”:无效的托管/非托管类型组合(此 值类型必须与结构成对出现)。“:”“System.TypeLoadException

    为什么会发生这种情况,以及如何解决这种情况?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Graviton    6 年前

    解决办法是

    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct _DRIVER_VERSION
    {
        public System.UInt32 DriverNum;
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16)]
        public Version16[] Version16;
    
    }
    

    这个 Version16 应该是数组,而不是字段