J'ai une DLL non managée qui est appelée à partir de .NET avec des tampons pré-alloués pour être rempli dans la DLL non managée (selon Pass C# string to C++ and pass C++ result (string, char*.. whatever) to C#).Appel DLL non géré avec tampon fixe à partir du code managé (problème de codage)
Ma fonction non managée a le prototype suivant:
myFunc(char* a_inBuf, int a_InLen,
char* a_outBuf, int* a_pOutLen,
char* a_errBuf, int* a_pErrLen);
Alors, je déclare la méthode dans le code managé comme ceci:
public static extern int myFunc(
[In, MarshalAs(UnmanagedType.LPStr)] string inputXml, int inputLen,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder outputXml, ref int outputLen,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder errorXml, ref int errorLen);
Avant d'appeler myFunc
, je crée les deux StringBuilders:
StringBuilder outputXml = new StringBuilder(100);
StringBuilder errorXml = new StringBuilder(100);
Après avoir appelé myFunc
, je prends le tw o StringBuilders et les écrire dans un fichier XML (un pour chaque StringBuilder) en utilisant
using (StreamWriter writer = new StreamWriter("OutputXmlFile.xml", false, Encoding.UTF8))
{
writer.Write(outputXml.ToString());
writer.Close();
}
La sortie doit être écrit en UTF8 depuis l'entrée est également UTF8. Mais malheureusement, StringBuilder utilise le codage UTF16. Le contenu de outputXml
et errorXml
est rempli dans la DLL non managée également dans le codage UTF8. Ce comportement ne doit pas être modifié. Lors de l'écriture des fichiers, les caractères spéciaux contenus dans StringBuilders ne sont pas écrits correctement.
Comment puis-je dire à StringBuilder que le contenu est réellement NON UTF16 mais UTF8?
Edit:the answer provided by Polynomial indique à utiliser xmlwriter pour écrire le fichier. Mais en réalité, l'écriture est juste utilisée pour la sortie de débogage. En cours d'exécution normale, le contenu de outputXml
et errorXml
est directement utilisé dans le programme. Par conséquent, toute indication concernant l'utilisation de classes de gestion XML spéciales n'est pas utile.
Le problème réel consiste à extraire les chaînes correctes de StringBuilder (ou à les convertir pour qu'elles soient correctes).
belle, propre et solution de travail. Merci! – eckes