我有一個非託管的DLL,從.NET調用預分配的緩衝區以滿足非託管DLL(根據Pass C# string to C++ and pass C++ result (string, char*.. whatever) to C#)。從託管代碼調用非託管DLL與固定緩衝區(編碼問題)
我的非託管函數的原型如下:
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
後,我把tw ÒStringBuilders,並寫入到使用
using (StreamWriter writer = new StreamWriter("OutputXmlFile.xml", false, Encoding.UTF8))
{
writer.Write(outputXml.ToString());
writer.Close();
}
輸出的XML文件(每個StringBuilder的)應被寫在UTF8由於輸入也是UTF8。但不幸的是,StringBuilder使用UTF16編碼。 outputXml
和errorXml
的內容也以UTF8編碼填充到非託管DLL中。這種行爲不應該改變。寫入文件時,StringBuilders中包含的特殊字符不能正確寫入。
如何告訴StringBuilder該內容實際上是而不是 UTF16但是UTF8?
編輯:the answer provided by Polynomial指示要使用的XmlWriter寫入文件。但實際上,寫作只是用於調試輸出。在正常的應用程序運行中,程序中直接使用outputXml
和errorXml
的內容。因此,關於使用特殊的XML處理類的任何提示都沒有用。
實際的問題是從StringBuilder中獲取正確的字符串(或將它們轉換爲正確的)。
漂亮,乾淨和工作的解決方案。謝謝! – eckes