我有一个由非托管代码调用的接口。它传递BSTR类型,但数据是ascii字符串。当它被写入文件时,我看到了意想不到的字符。我想到数据将如何传输Unmanaged [BSTR [ASCII]] - >托管[String [ASCII]] - >文件[Unicode [ASCII]]因此输入中的字符应与输出中的字符相同。它是否正确?非托管代码调用的接口函数如下所示。
//C# interface called by unmanged code
public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String asciiData)
{
File.WriteAllText(fileName, asciiData);
}
答案 0 :(得分:1)
首先,.NET字符串是始终是unicode 字符串。您可以使用相应的编码获取具体字符串的任何表示,但字符串中的所有字符都是unicode字符。
其次,如果您使用的是UnmanagedType.BStr,那么非托管代码必须通过BSTR并自行解决字符编码问题(ASCII是单字节,BSTR是双字节)。如果不可能,你应该考虑另一种类型的编组,例如: UnmanagedType.LPStr。