Wie die zugrunde liegenden stdio FILE * von einem verwalteten System.IO.FileStream zu bekommen?

StackOverflow https://stackoverflow.com/questions/819268

  •  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);
}
War es hilfreich?

Lösung

System.IO.FileStream.Handle

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 *).

zu konvertieren

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top