¿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.