У меня есть приложение .NET Core 2.2 C #, которое использует DllImport для извлечения собственной разделяемой библиотеки на CentOS 7.5 (интерфейс C ++ extern "C", скомпилированный с gcc).Для функций в библиотеке C ++ требуются параметры wchar_t *, но эти параметры отображаются в виде строк UTF16, а не строк UTF32, как реализовано в gcc / glibc.Это (моя) ошибка программиста или она должна быть вызвана командой .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]);
}
}
Я пытался использоватьMarshalAs(UnmanagedType.LPWSTR)
и / или CharSet.Unicode
на DllImport на управляемой стороне безрезультатно.Они оба дают схожие результаты:
[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:
Есть лиспособ решить эту проблему, не делая пользовательских сортировки?После всего, что я прочитал, кажется, что это должно быть простым заданием, но я здесь.