Ho cercato su internet in lungo e in largo ma non ho trovato una buona spiegazione.Posso usare SafeHandle invece di IntPtr?
La mia domanda è piuttosto semplice.
Ho una DLL che ha una funzione denominata Initialize e uno dei parametri è un puntatore che riceverà un handle da utilizzare con le chiamate successive. Un altro parametro è una stringa che elencherò per completezza. La firma che sto usando è (nella sua forma semplice):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
La firma nella DLL stesso è scritto come: Initialize(LPTSTR name, HANDLE handle)
con il commento "MANICO: Puntatore a una posizione che riceverà la maniglia".
e successive chiamate sono in forma di
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
ho letto su SafeHandle
e mi chiedevo se potevo usarlo per substite per il mio manico IntPtr. E se posso, come lo faccio? Estendere la classe SafeHandle astratta non è un problema, ma posso sostituire direttamente IntPtr per SafeHandle (e utilizzare Marshalling predefinito) o devo fare qualcosa in più?
Quali benefici ha 'SafeHandle' che basta memorizzare il' IntPtr' danno non? –
@ScottChamberlain - 'SafeHandle' è' IDisposable' e garantisce che le risorse cui fa riferimento l'handle vengano rilasciate.'IntPtr' è semplicemente un valore di dimensione puntatore che può essere passato in giro - non ha una semantica di eliminazione. – LBushkin
Supponendo che sia consentito addebitare la memoria, a meno che non sia possibile annullare l'allocazione della memoria del puntatore utilizzando 'Marshal.FreeBSTR',' Marshal.FreeCoTaskMem' o 'Marshal.FreeHGlobal', non penso che si possa tranquillamente de -Allocare la memoria da C#. Usando 'IntPtr', C# non tenterà di liberare automaticamente la memoria. – Pooven