Ich benutze eine alte API und muss den Zeiger einer Struktur an nicht verwalteten Code übergeben, der asynchron läuft.Fixieren einer aktualisierbaren Struktur vor der Übergabe an nicht verwalteten Code?
Mit anderen Worten, nach der Übergabe des struct-Zeigers an den nicht verwalteten Code kopiert der nicht verwaltete Code den Zeiger und kehrt sofort zurück. Der nicht verwaltete Code kann auf diese Struktur im Hintergrund in einem anderen Thread zugreifen. Ich habe keine Kontrolle über den nicht verwalteten Code, der in einem anderen Thread noch den Thread selbst ausgeführt wird.
Die fixierte {} -Anweisung kann nicht zum Pinnen verwendet werden, da sie nicht für async unmanaged Pinning entworfen wurde.
GCHandle kann nur Referenzen pinnen, daher muss die Struktur für die Verwendung von GCHandle eingerahmt werden. Ich habe es versucht, und es funktioniert. Das Hauptproblem dabei ist, dass Sie die Struktur aus verwaltetem Code nicht aktualisieren können. Um eine Struktur zu aktualisieren, müssen wir sie zuerst entpacken, dann aktualisieren, dann wieder boxen, aber ... oops ... box wieder?!? das bedeutet, dass der vorherige Zeiger im Speicher immer noch auf die alte, nicht aktuelle Struktur verweist, und die neue Struktur einen anderen Zeiger hat, und das bedeutet, dass ich einen neuen Zeiger auf den nicht verwalteten Code übergeben muss ... in meiner Anwendung nicht anwendbar Fall.
Wie kann ich eine Struktur in den Speicher ohne feste {} -Anweisung, und damit ich es aus verwaltetem Code ohne Änderung ändern, es Zeiger ist?
Danke.
Edit:
dachte nur ... ist es eine Möglichkeit, das übergeordnete Objekt an Pin, der die Struktur enthält, und erhalten dann den Zeiger des struct anstatt das Container-Objekt?
Ich hätte erwartet, dass GCHandle hier die Lösung ist. Wenn alles fehlschlägt, können Sie den Speicher im nicht verwalteten Code zuordnen, sodass er nicht vom GC verschoben werden kann. – dtb
Gute Frage. Ich denke, dass ich das in CLI/C++ getan habe, ich muss meine Arbeitsnotizen darauf überprüfen. Nicht sicher, ob es einen C# äquivalenten Mechanismus gibt. –
Vielleicht führen Sie den Aufruf in einem eigenen Hintergrundthread aus, verwenden Sie fixed {} und verlassen Sie niemals den festen Block {} (zumindest solange der nicht verwaltete Code auf die Struktur zugreift)? –