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);
}
Foi útil?

Solução

System.IO.FileStream.Handle

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top