Ich habe das Internet weit und breit gesucht, aber keine gute Erklärung gefunden.Kann ich SafeHandle anstelle von IntPtr verwenden?
Meine Frage ist ziemlich einfach.
Ich habe eine DLL, die eine Funktion namens Initialize hat und einer der Parameter ist ein Zeiger, der ein Handle erhalten wird, um mit nachfolgenden Aufrufen verwendet zu werden. Ein weiterer Parameter ist ein String, den ich zur Vollständigkeit auflisten werde. Die Unterschrift Ich verwende ist (in seiner einfachen Form):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
Die Signatur in der DLL selbst geschrieben als: Initialize(LPTSTR name, HANDLE handle)
mit dem Kommentar „HANDLE: Pointer auf eine Stelle, die den Griff bekommt“.
Und nachfolgende Aufrufe sind in Form von
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Ich habe über SafeHandle
lesen, und ich habe mich gefragt, ob ich es für meinen IntPtr Griff substite nutzen könnte. Und wenn ich kann, wie mache ich das? Das Erweitern der abstrakten SafeHandle-Klasse ist kein Problem, aber kann ich mein IntPtr für SafeHandle direkt ersetzen (und Standard-Marshalling verwenden) oder muss ich etwas extra tun?
Welchen Nutzen hat 'SafeHandle' Sie geben, dass die' IntPtr' nur speichern:
Einige weitere interessante Leckerbissen über IntPtr vs Safehandle finden Sie unter nicht? –
@ScottChamberlain - 'SafeHandle' ist' IDisposable' und stellt sicher, dass Ressourcen, auf die sich das Handle bezieht, freigegeben werden.'IntPtr' ist einfach ein zeigergroßer Wert, der herumgereicht werden kann - er hat keine Entsorgungssemantik. – LBushkin
Angenommen, Sie dürfen den Speicher aufladen, es sei denn, Sie können den Zeigerspeicher mit 'Marshal.FreeBSTR',' Marshal.FreeCoTaskMem' oder 'Marshal.FreeHGlobal' freischalten. Ich glaube nicht, dass Sie das sicher tun können - Weisen Sie den Speicher von C# zu. Mit 'IntPtr' versucht C# nicht, Speicher automatisch zu löschen. – Pooven