Comment obtenir le fichier * stdio sous-jacent d'un System.IO.FileStream géré?
-
03-07-2019 - |
Question
J'écris un adaptateur .NET pour une bibliothèque C / C ++ dans laquelle une méthode "bar". prend un DOSSIER stdio régulier *. Est-il possible de créer une interface de sorte que l'utilisateur de code géré puisse transmettre un flux (fichier) géré? C'est sans créer un tampon intermédiaire et un code pour canaliser les données entre. De plus, l’hypothèse que bar () lit seulement améliore-t-elle les choses?
// native code
void bar(FILE*);
// interface for managed code
void foo(System::IO::FileStream^ file)
{
FILE* stdio_handle = ???;
bar(stdio_handle);
}
La solution
Ce n'est pas nécessairement stdio
. C'est un handle de Windows. Je ne pense pas que FileStream
soit construit sur stdio
pour avoir un stdio
.
Comme Marc l'a souligné et mentionné dans le lien MSDN, vous pouvez envisager d'utiliser la propriété SafeFileHandle
(si vous êtes sur .NET 2.0+) au lieu de Handle
( qui est maintenant considéré comme obsolète). Seul Handle
est disponible dans les anciennes versions.
Autres conseils
Est-il possible de construire une interface de sorte que l'utilisateur de code géré peut passer un flux (fichier) géré?
Non, il n'est pas possible de convertir un flux en descripteur de fichier ( FILE
*).
Si vous devez avoir un pseudo stdio, vous pouvez toujours utiliser fopen pour ouvrir le fichier en premier lieu. Cette décrit un wrapper pour exporter le fichier c stdlib fonctions, puis il utilise interop pour travailler avec elles.