Ich habe eine DLL, aus der ich die folgende C-Methode P/Invoke muss:
int DAOpen(HANDLE *hOpen, UNIT *flags, void *callback, char *userData)
Ich habe mir die folgende C#-Signatur ausgedacht:
[DllImportAttribute("<libName>", EntryPoint="DAOpen")]
static extern int DAOpen(
out IntPtr hOpen,
ref uint flags,
IntPtr callback,
IntPtr userData);
Angenommen, der native Code behält einen Verweis auf alle Parameter länger als die Dauer des P/Invoke-Aufrufs:
-
Neben der Beibehaltung einer Instanz der
hOpen
Soll ich es auch anheften? -
Sollte ich einen Verweis auf die
flags
variabel? Sollte ich sie auch anheften, da sie in diesem speziellen Fall als Referenz übergeben wird? -
Ich weise meine
callback
auf folgende Weise zu delegieren:private IntPtr callBackOnNativeEvents;
...
this.callBackOnNativeEvents = Marshal.GetFunctionPointerForDelegate(
new CallBack(this.CallBackOnNativeEvents));
Sollte ich einen Verweis auf den Delegaten an sich (nicht nur den Zeiger) behalten? Sollte ich ihn auch anheften?
-
Schließlich definiere ich die
userData
auf die folgende Weise:private IntPtr userData;
...
string userName = "test";
this.userData = Marshal.StringToHGlobalAnsi(userName);
Sollte ich einen Verweis auf die Zeichenfolge behalten? Sollte ich sie auch anheften? Die API-Dokumentation besagt, dass der Inhalt der Zeichenfolge in den nicht verwalteten Speicher kopiert wird, aber ich bin mir nicht sicher, ob auch der Inhalt des Verweises kopiert wird.