我有一个.NET Core 2.2 C#应用程序,该应用程序使用DllImport引入CentOS 7.5(使用gcc编译的C ++ extern“ C”接口)上的本机共享库。 C ++库中的函数需要wchar_t *参数,但是这些参数似乎以UTF16字符串而不是gcc / glibc中实现的UTF32字符串编组。这是我的程序员错误还是应该向.NET Core团队提出?
这是我要调用的高度复杂的方法:
void wchar_tTest(const wchar_t *arg1, const wchar_t *arg2)
{
std::wcout << L"wchar_tTest: arg1: " << arg1 << L", arg2: " << arg2 << std::endl;
char *s = (char *)arg1;
for (int i = 0; i < 12; i++)
{
printf("%d: %c\n", i, s[i]);
}
}
我已尝试在受管端的DllImport上使用MarshalAs(UnmanagedType.LPWSTR)
和/或CharSet.Unicode
无济于事。这些都产生相似的结果:
[DllImport("cover", EntryPoint = "wchar_tTest", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern void LPWSTRStringTest([MarshalAs(UnmanagedType.LPWStr)] string arg1, [MarshalAs(UnmanagedType.LPWStr)] string arg2);
[DllImport("cover", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern void wchar_tTest(string arg1, string arg2);
调用看起来像这样(stringTest()
是一个类似的调用,但带有char *
参数的函数):
string arg1 = "Hello!";
string arg2 = "Goodbye!";
stringTest(arg1, arg2);
wchar_tTest(arg1, arg2);
LPWSTRStringTest(arg1, arg2);
通过wcout
转储参数时,Hello!
变成Hlo
,而Goodbye!
变成Gobe
。当您逐个字符地查看输出时,输出看起来像可疑的UTF16。看起来wchar_t *
会跳过所有其他UTF16字符(将其视为我假设的UTF32字符串)。
wchar_tTest: arg1: Hlo, arg2: Gobe
0: H
1:
2: e
3:
4: l
5:
6: l
7:
8: o
9:
10: !
11:
有没有一种方法可以解决此问题而无需进行自定义编组?毕竟我已经读过了,看来这应该是一个简单的任务,但是我在这里。
答案 0 :(得分:0)
按照预期和设计,文本被编组为UTF16。您需要:
答案 1 :(得分:-1)
鉴于我看到的访问量没有很好的答案,鉴于世界上C ++ /本机库这一方面的局限性,我将发布短期黑客来解决此问题……
>我修改了DllImport以声明byte []参数
[DllImport("cover", EntryPoint = "wchar_tTest", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern void utf32Test(byte[] arg1, byte[] arg2);
并创建了.NET字符串的UTF32编码版本
string arg1 = "Hello!";
byte[] arg1UTF32 = Encoding.UTF32.GetBytes(arg1);
string arg2 = "Goodbye!";
byte[] arg2UTF32 = Encoding.UTF32.GetBytes(arg2);
utf32Test(arg1UTF32, arg2UTF32);
瞧,您将获得预期的输出字符串和数组内容
wchar_tTest: arg1: Hello!, arg2: Goodbye!
0: H
1:
2:
3:
4: e
5:
6:
7:
8: l
9:
10:
11:
虽然这几乎不是非常可移植的,但是当您在Windows系统上运行它时当然会失败。我希望有一个更好的答案。