Como obter o subjacente stdio FILE * de um System.IO.FileStream gerenciado?
-
03-07-2019 - |
Pergunta
Eu estou escrevendo um .NET adaptador para uma biblioteca de C / C ++, onde um método de "bar" leva um stdio arquivo regular *. É possível construir uma interface para que o usuário código gerenciado pode passar um fluxo gerenciado (File)? Isto é, sem a criação de um tampão intermediário e de código para os dados entre tubo. Também faz a suposição de que bar () lê apenas fazer as coisas melhor?
// native code
void bar(FILE*);
// interface for managed code
void foo(System::IO::FileStream^ file)
{
FILE* stdio_handle = ???;
bar(stdio_handle);
}
Solução
Não é necessariamente alça stdio
. É um identificador do Windows. Eu não acho que FileStream
é construída sobre stdio
ter uma alça stdio
.
Como Marc apontou e mencionado na ligação MSDN, você pode querer considerar o uso de propriedade SafeFileHandle
(se você estiver em .NET 2.0+) em vez de Handle
(que agora é considerado obsoleto). Apenas Handle
está disponível nas versões mais antigas, no entanto.
Outras dicas
É possível construir uma interface para que o usuário código gerenciado pode passar um gerenciados (File) Stream?
Não, não é possível converter um fluxo em um descritor de arquivo (FILE
*).
Se você tem que ter uma alça stdio, você pode sempre usar fopen para abrir o arquivo em primeiro lugar. Este descreve um invólucro para exportar o arquivo stdlib c funções e, em seguida, ele usa interoperabilidade para trabalhar com eles.