¿Manera correcta de ordenar SIZE_T *?

Tengo la siguiente definición de función de C ++, a la que estoy intentando llamar mediante PInvoke desde el código administrado:

bool FooBar(SIZE_T* arg1);

Mi declaración administrada tenía el siguiente aspecto:

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

Algunos de ustedes pueden notar el mismo error que eventualmente hice. Esto no es portátil de 64 bits. SIZE_T es de tamaño variable (32-64 bit) al igual que el puntero a él. En el tamaño administrado, el puntero se traduce correctamente a 64 bits, pero la uint no lo hace, y puede terminar con la basura en los bits superiores de arg1. Este fue un error especialmente persistente ya que la basura era a menudo solo ceros :(

La única solución que he llegado a trabajar es la siguiente declaración administrada:

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

Esto funciona, por supuesto, porque IntPtr puede variar su tamaño correctamente. En mi código, simplemente trato el IntPtr como un entero, y funciona, aunque parece un truco feo. Me parece que debería haber alguna forma de especificar esto correctamente, tal vez utilizando UnmanagedType.SysUInt, pero no he podido encontrar ninguna otra solución que funcione.

Respuestas a la pregunta(2)

Su respuesta a la pregunta