Wie die zugrunde liegenden stdio FILE * von einem verwalteten System.IO.FileStream zu bekommen?
-
03-07-2019 - |
Frage
Ich schreibe einen .NET-Adapter für ein C / C ++ Bibliothek, in der ein Verfahren "bar" * einen regelmäßigen stdio FILE nimmt. Ist es möglich, eine Schnittstelle zu bauen, so dass verwalteten Code Benutzer eine verwaltete (Datei) Stream passieren kann? Das heißt, ohne einen Zwischenpuffer und Code zum Rohr zu schaffen, die Daten zwischen. Auch macht die Annahme, dass bar () liest nur die Dinge besser machen?
// native code
void bar(FILE*);
// interface for managed code
void foo(System::IO::FileStream^ file)
{
FILE* stdio_handle = ???;
bar(stdio_handle);
}
Lösung
Es ist nicht unbedingt stdio
Griff. Es ist ein Windows-Handle. Ich glaube nicht, FileStream
auf stdio
gebaut ist ein stdio
Griff zu haben.
Wie Marc aufgezeigt und in der MSDN-Link erwähnt, möchten Sie vielleicht mit SafeFileHandle
Eigenschaft zu berücksichtigen (wenn Sie auf .NET sind 2.0+) statt Handle
(die mittlerweile veraltet betrachtet). Nur Handle
ist in älteren Versionen verfügbar, though.
Andere Tipps
Ist es möglich, eine Schnittstelle zu bauen so dass verwalteten Code Benutzer kann passieren verwaltet (Datei) Stream?
Nein, es ist nicht möglich, einen Strom an einen Dateideskriptor (FILE
*).
Wenn Sie einen stdio Griff haben, könnten Sie immer fopen verwenden, um die Datei an erster Stelle zu öffnen. Diese einen Wrapper beschreibt die c stdlib-Datei zu exportieren Funktionen und er nutzt dann Interop mit ihnen zu arbeiten.