Bei der übergabe einer verwalteten byte [] - array über PInvoke ausgefüllt werden, die von Win32, muss es fixiert werden?
Nehme an, du hast den Aufruf einer Win32-Funktion füllen, die in Ihrem byte-array. Erstellen Sie ein array der Größe 32, leer. Dann geben Sie in der Win32-Funktion gefüllt werden, int", und verwenden Sie es später in Ihrem verwalteten code. Gibt es die chance, dass das byte-array könnte verschoben werden oder überschrieben werden zwischen der Zeit, zu der es zugeordnet wurde, und es ist ausgefüllt durch die Win32-Funktion?
InformationsquelleAutor Leeks and Leaks | 2010-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Nein, die Belegung ist in diesem Fall nicht notwendig
Längere Antwort:
Wird die CLR automatisch die pin-Referenzen auf verwaltete Objekte, wenn das Kreuz die PInvoke-Grenze. Sobald die PInvoke-Funktion beendet wird der Verweis aufgehoben. Also in Situationen, wie eine native Funktion füllen
byte[]
Nein manuell pinning ist notwendig, da das Objekt wird ausschließlich von native-code beim Aufruf der Funktion.Manuell Belegung des Arrays wird notwendig, wenn der native code speichert die verwalteten Zeiger. Wenn dies geschieht, müssen Sie manuell eine pin-array, bis der native code muss nicht mehr den Zeiger. In diesem Fall, ich nehme an, der Zeiger wird nicht zwischengespeichert, daher ist es nicht notwendig, die pin -
Referenz - http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2
Gut, ich sollte gelesen haben, den ersten link, da gibt es ReadFileEx und overlapped I/O als ein Beispiel, wenn Sie brauchen, um pin.
InformationsquelleAutor JaredPar
laut msdn Marshalling-Arrays der Typen nur ein array per Referenz übergeben werden kann, geschrieben von nicht verwaltetem code. So scheint es, dass Sie muss deklarieren Sie die array-parameter [out] oder [in,out], wenn Sie möchten füllen Sie es in auf dem nicht verwalteten Seite.
Dieser Seite http://msdn.microsoft.com/en-us/library/aa719896(VS.71).aspx leitet weiter zu gehen und weiter, ohne jemals ausdrücklich zu sagen, dass der marshaller pins des arrays beim Aufruf von verwalteten an nicht verwaltete, aber vieles von dem, was es beschreibt, würde nicht funktionieren, wenn der marshaller nicht pin.
InformationsquelleAutor John Knoeller
Sorry die Beantwortung meiner eigenen Frage, aber ich glaube, wenn der Typ für blitvorgänge geeignet ist, als byte[] ist, dann werden die Arrays angeheftet werden, während Sie gemarshallt, der von der Laufzeit, so dass kein pinning benötigt werden würde. Ein Objekt auf das andere mal anders sein würde. Bitte korrigieren Sie mich, wenn ich falsch Liege.
Sie die pin ein byte[] aus, indem Sie die
fixed
keyword innerhalb einerunsafe
code-block. Siehe msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspxIch denke, er ist genau hier. Der marshaller pin-code wird das array beim Aufruf von managaged, um native, also das array würde nur noch fixiert werden, explizit, wenn Sie wollten, verweisen es in den nativen code zu einem anderen Zeitpunkt.
InformationsquelleAutor Leeks and Leaks