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

时间:2013-02-14 00:57:28

标签: c# c++ pinvoke

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

在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类型,但我想知道这个。

我是托管/非管理关系的新手,所以我不确定发生了什么。任何想法?

1 个答案:

答案 0 :(得分:0)

有几种选择。首先,您可以将整个结构标记为Unicode(因此chars将被解释为wchar_t):

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

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

short ch1;

或者告诉编组人员明确使用每个项目:

[MarshalAs(UnmanagedType.U2)] char ch1;