将非托管unicode字符串编组到.net。高字符替换为问号

blu*_*dog 5 c# c++ swig

这可能是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类型(?)

Jim*_*hel 5

CreateWString定义修改为:

[return: MarshalAs(UnmanagedType.LPWStr)]
static string CreateWString([MarshalAs(UnmanagedType.LPWStr)]IntPtr cString)
Run Code Online (Sandbox Code Playgroud)

请参阅MarshalAsAttribute文档中的示例。