Правильный путь к маршалу SIZE_T *?

У меня есть следующее определение функции C ++, которое я пытаюсь вызвать через PInvoke из управляемого кода:

bool FooBar(SIZE_T* arg1);

Моя управляемая декларация выглядела следующим образом:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);

Некоторые из вас могут заметить ту же ошибку, что и я. Это не 64-битный портативный. SIZE_T имеет переменный размер (32-64 бита), как и указатель на него. В управляемом размере указатель правильно переводится в 64-битный, а uint - нет, и вы можете получить мусор в верхних битах arg1. Это была особенно постоянная ошибка, так как мусор часто был просто нулями :(

Единственное решение, которое я получил, - это следующее управляемое объявление:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);

Это работает, конечно, потому что IntPtr может правильно изменять свой размер. В моем коде я просто рассматриваю IntPtr как целое число, и оно работает, хотя выглядит как уродливый хак. Мне кажется, должен быть какой-то способ указать это правильно, возможно, с помощью UnmanagedType.SysUInt, но я не смог найти какое-либо другое рабочее решение.

Ответы на вопрос(2)

Ваш ответ на вопрос