He buscado en Internet por todas partes pero no encontré una buena explicación.¿Puedo usar SafeHandle en lugar de IntPtr?
Mi pregunta es bastante simple.
Tengo un archivo DLL que tiene una función llamada Inicializar y uno de los parámetros es un puntero que recibirá un identificador para ser utilizado con las llamadas siguientes. Otro parámetro es una cadena que enumeraré para completar. La firma que estoy usando es (en su forma simple):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
la firma en el propio archivo DLL se escribe como: Initialize(LPTSTR name, HANDLE handle)
con el comentario "MANGO: Puntero a una ubicación que recibirá el mango".
y posterior llamadas están en la forma de
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
He estado leyendo sobre SafeHandle
y me preguntaba si podría utilizarlo para substite para mi mango IntPtr. Y si puedo, ¿cómo lo hago? La extensión de la clase abstracta SafeHandle no es un problema, pero ¿puedo sustituir directamente mi IntPtr por SafeHandle (y usar Marshalling predeterminado) o necesito hacer algo extra?
qué beneficios 'SafeHandle' usted que acaba de almacenar el' IntPtr' dan ¿no? –
@ScottChamberlain - 'SafeHandle' es' IDisposable' y garantiza que se liberen los recursos a los que hace referencia el identificador.'IntPtr' es simplemente un valor del tamaño de un puntero que se puede pasar: no tiene semántica de eliminación. – LBushkin
Suponiendo que se le permite cargar la memoria, a menos que pueda desasignar la memoria del puntero usando 'Marshal.FreeBSTR',' Marshal.FreeCoTaskMem', o 'Marshal.FreeHGlobal', no creo que pueda -alcanzar la memoria desde C#. Usando 'IntPtr', C# no intentará liberar memoria automáticamente. – Pooven