Verweisübergabe bei P/Invoke

07/02/2008 - 12:51 von Heiko Berres | Report spam
Hallo allerseits!
Ich habe nun schon einige Zeit zu diesem Thema im Web gesucht, aber noch
keine klar verstàndliche (zumindest nicht für mich) Aussage finden können.

Ich greife mittels der API-Funktion ReadFile auf den Bootsektor einer
Festplatte zu, meine Import-Deklaration sieht folgendermaßen aus:

[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool ReadFile(SafeFileHandle file, byte[] buffer, int
numOfBytesToRead, ref int numOfBytesRead, IntPtr overlapped);

Der Aufruf von ReadFile hat mir bisher auch keine Probleme bereitet,
allerdings mache ich mir doch etwas Sorgen, weil ich die Referenz auf den
verwalteten Lesepuffer (byte[] buffer) direkt übergebe, anstatt einen
fixierten Zeiger zu übergeben. Das will ich aber vermeiden, damit ich keinen
unsafe-Block verwenden muss.

Nach ausgiebiger Suche in der MSDN habe ich auf der Seite
http://msdn2.microsoft.com/de-de/library/23acw07k(VS.80).aspx die Aussage
gefunden, dass "wàhrend des Marshallens für Objekte, z. B. String, (werden)
die Daten automatisch fixiert" werden. Allerdings ist mir nicht klar, ob
darunter auch mein Puffer vom Typ byte[] fàllt, der ja ein Verweistyp ist.
Ist es richtig, dass ich dahingehend den Puffer direkt übergeben kann, ohne
ihn vorher ausdrücklich zu fixieren?

Ich wàre sehr dankbar, wenn mir dazu jemand eine versichernde Aussage geben
könnte, vor allem, weil ich demnàchst auch auf gleichem Wege in den
Bootsektor schreiben muss.

Gruß

H.Berres
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
07/02/2008 - 13:27 | Warnen spam
Hallo Heiko!

"Heiko Berres" <heiko.berres@(nospam)iba-ag.com> schrieb:
Ich greife mittels der API-Funktion ReadFile auf den Bootsektor einer
Festplatte zu, meine Import-Deklaration sieht folgendermaßen aus:

[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool ReadFile(SafeFileHandle file, byte[] buffer, int
numOfBytesToRead, ref int numOfBytesRead, IntPtr overlapped);

Der Aufruf von ReadFile hat mir bisher auch keine Probleme bereitet,
allerdings mache ich mir doch etwas Sorgen, weil ich die Referenz auf den
verwalteten Lesepuffer (byte[] buffer) direkt übergebe, anstatt einen
fixierten Zeiger zu übergeben. Das will ich aber vermeiden, damit ich
keinen
unsafe-Block verwenden muss.

Nach ausgiebiger Suche in der MSDN habe ich auf der Seite
http://msdn2.microsoft.com/de-de/library/23acw07k(VS.80).aspx die Aussage
gefunden, dass "wàhrend des Marshallens für Objekte, z. B. String,
(werden)
die Daten automatisch fixiert" werden. Allerdings ist mir nicht klar, ob
darunter auch mein Puffer vom Typ byte[] fàllt, der ja ein Verweistyp ist.
Ist es richtig, dass ich dahingehend den Puffer direkt übergeben kann,
ohne
ihn vorher ausdrücklich zu fixieren?



Ich habe jetzt keine Referenz zur Hand, aber Du kannst davon ausgehen, daß
der Arrayparameter ohne Dein Zutun im Speicher fixiert wird.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen