wchar_t数据从非托管状态混乱到托管状态

本文关键字:状态 混乱 数据 wchar | 更新日期: 2023-09-27 17:58:57

我在C#中有一个托管的GUI,在C++中有非托管的DLL。我通过引用填充结构的DLL函数来传递结构。该结构有几个wchart元素和几个字符串。

在DLL中,所有数据在返回GUI之前看起来都很好。例如:

struct1->ch1 = 0x1234;
struct1->ch2 = 0x5678;
struct1->ch3 = 'ab';
struct1->ch4 = 'cd';

但是当从DLL返回结构体时,数据是乱码的。

struct1->ch1 == 0x0034
struct1->ch2 == 0x0012
struct1->ch3 == 0x0078
struct1->ch4 == 0x0056

其他字符串元素返回良好。

填充的char数据是单字节的,所以我知道我可以使用BYTE类型,但我想弄清楚这一点。

我是管理/非管理关系的新手,所以我不知道发生了什么。有什么想法吗?

wchar_t数据从非托管状态混乱到托管状态

有几个选项。首先,您可以使用将整个结构标记为Unicode(因此chars将被解释为wchar_t

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct MyStruct { ... }

或者,您可以使用16位int:

short ch1;

或者告诉整理人员使用明确地执行每个项目

[MarshalAs(UnmanagedType.U2)] char ch1;