Come ottenere il file STDIO * sottostante di un System.IO.FileStream gestito?
-
03-07-2019 - |
Domanda
Sto scrivendo un adattatore .NET per una libreria C / C ++ in cui un metodo "barra" prende un normale FILE stdio *. È possibile creare un'interfaccia in modo che l'utente del codice gestito possa passare un flusso (File) gestito? Cioè senza creare un buffer intermedio e un codice per reindirizzare i dati. Inoltre, il presupposto che bar () legge solo migliora le cose?
// native code
void bar(FILE*);
// interface for managed code
void foo(System::IO::FileStream^ file)
{
FILE* stdio_handle = ???;
bar(stdio_handle);
}
Soluzione
System.IO.FileStream. Maniglia
Non è necessariamente stdio
. È un handle di Windows. Non credo che FileStream
sia basato su stdio
per avere un stdio
.
Come ha sottolineato Marc e menzionato nel collegamento MSDN, potresti prendere in considerazione l'utilizzo della proprietà SafeFileHandle
(se utilizzi .NET 2.0+) anziché Gestisci
( che ora è considerato obsoleto). Tuttavia, nelle versioni precedenti è disponibile solo Gestisci
.
Altri suggerimenti
È possibile creare un'interfaccia in modo che l'utente del codice gestito possa passare a gestito (File) Stream?
No, non è possibile convertire uno stream in un descrittore di file ( FILE
*).
Se devi avere un handle stdio, puoi sempre usare fopen per aprire il file in primo luogo. Questo descrive un wrapper per esportare il file c stdlib e quindi usa l'interoperabilità per lavorare con loro.