Маршалинг массива C ++ с ошибками выдает ошибку «Недопустимая комбинация управляемого / неуправляемого типа» - PullRequest
0 голосов
/ 22 мая 2018

Это мое определение C ++:

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

И вот мой код взаимодействия с C #:

[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': недопустимая комбинация управляемого / неуправляемого типа (этот тип значения должен быть связан со Struct).": ""} System.TypeLoadException

Любая причина, почему это происходит, и как это исправить?

1 Ответ

0 голосов
/ 22 мая 2018

Исправление

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

}

Version16 должно быть массивом, а не полем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...