Kann ich mithilfe von SafeHandle-statt IntPtr?

Ich habe im internet gesucht weit und breit, aber nicht finden, eine gute Erklärung.

Meine Frage ist ziemlich einfach.

Ich habe eine DLL, die hat eine Funktion namens Initialize, und einer der Parameter ist ein Zeiger, erhalten ein handle verwendet werden, mit nachfolgenden Aufrufe. Ein weiterer parameter ist eine Zeichenkette, die ich Liste auf Vollständigkeit. Die Signatur, die ich verwende, ist (in seiner einfachen form):

[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);

Die Signatur der DLL selbst geschrieben: Initialize(LPTSTR name, HANDLE handle) mit dem Kommentar "GRIFF: Zeiger auf einen Speicherort, erhalten Sie den Griff".

Und nachfolgende Aufrufe werden in form von

[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);

Habe ich gelesen, über SafeHandle und ich Frage mich, ob ich verwenden könnte, es zu substite für meine IntPtr handle. Und wenn ich kann, wie mache ich es? Verlängerung der abstract SafeHandle-Klasse ist nicht ein Problem, aber kann ich direkt Ersatz meine IntPtr für SafeHandle (und verwenden Sie die Standard-Marshalling) oder muss ich etwas extra zu tun?

Was nützt SafeHandle geben Sie, dass nur die Speicherung der IntPtr nicht?
SafeHandle ist IDisposable und sorgt dafür, dass Ressourcen bezeichnet, die durch das handle freigegeben werden. IntPtr ist einfach ein Zeiger-große Wert, der übergeben werden kann, um, es hat keine Entsorgung Semantik.
Angenommen, Sie sind erlaubt Gebühr für den Speicher, es sei denn, Sie können de-allocate der Zeiger Speicher mit Marshal.FreeBSTR, Marshal.FreeCoTaskMem oder Marshal.FreeHGlobal ich glaube nicht, dass Sie können sicher de-den Speicher von C#. Mit IntPtr C# wird nicht versuchen, um den freien Speicher automatisch.

InformationsquelleAutor Davio | 2012-08-15

Schreibe einen Kommentar