这可能是SWIG问题,也可能不是。
我正在尝试将值从C ++函数返回到std :: wstring到C#。返回的字符串包含普通的老式英语字符和希伯来字符。英文字符可以正常使用,但是希伯来语字符在某些时候会转换为问号符号。
我正在使用SWIG生成编组代码。使用调试器逐步完成所有工作,然后进入以下SWIG代码...
static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString) {
string str = System.Runtime.InteropServices.Marshal.PtrToStringUni(cString);
return str;
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,str看起来很完美。
接下来,将其返回到SWIG生成的C ++代码,该代码将str作为void *返回。
然后void *在调用代码中再次成为.net字符串。在调用代码中,所有希伯来字符都是?分数。
任何想法是什么原因造成的?
编辑:
更多信息
一旦CreateWString返回到C ++调用程序,您可以看到调试器中的指针看起来像是带有?的ANSI字符串。标记。因此,似乎.net在返回给调用者之前对字符串执行了某种转换。听起来对吗?我该如何控制?
编辑2: 似乎我需要在返回类型CreateWString上执行MarshallAs,以阻止.net转换为TCHAR类型(?)
将CreateWString定义修改为:
[return: MarshalAs(UnmanagedType.LPWStr)]
static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString)
Run Code Online (Sandbox Code Playgroud)
请参阅MarshalAsAttribute文档中的示例。