У меня есть неуправляемая DLL, которая вызывается из .NET с заранее выделенными буферами для заполнения внутри неуправляемой DLL (согласно Передача строки C # в C ++ и передача результата C ++ (string, char * .. и т. Д.) на C # ).
Моя неуправляемая функция имеет следующий прототип:
myFunc(char* a_inBuf, int a_InLen,
char* a_outBuf, int* a_pOutLen,
char* a_errBuf, int* a_pErrLen);
Итак, я объявляю метод в управляемом коде так:
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);
Перед вызовом myFunc
я создаю два StringBuilders:
StringBuilder outputXml = new StringBuilder(100);
StringBuilder errorXml = new StringBuilder(100);
После вызова myFunc
я беру два StringBuilder и записываю их в файл XML (по одному для каждого StringBuilder), используя
using (StreamWriter writer = new StreamWriter("OutputXmlFile.xml", false, Encoding.UTF8))
{
writer.Write(outputXml.ToString());
writer.Close();
}
Выходные данные должны быть записаны в UTF8, так как вход также UTF8. Но, к сожалению, StringBuilder использует кодировку UTF16. Содержимое outputXml
и errorXml
заполняется неуправляемой DLL также в кодировке UTF8. Это поведение не должно быть изменено. При записи файлов специальные символы, содержащиеся в StringBuilders, записываются неправильно.
Как мне сообщить StringBuilder, что содержимое на самом деле НЕ UTF16, но UTF8?
Редактировать: ответ, предоставленный полиномом , указывает на использование xmlWriter для записи файла. Но на самом деле, запись просто используется для отладки вывода. При обычном запуске приложения содержимое outputXml
и errorXml
напрямую используется в программе. Поэтому любые подсказки относительно использования специальных классов обработки XML бесполезны.
Фактическая проблема заключается в том, чтобы вывести правильные строки из StringBuilder (или преобразовать их в правильные).