Marshall结构与char

时间:2011-04-27 15:18:42

标签: c# c++ marshalling

当编组包含从C ++到C#的单个char字段的struct时,C#struct定义应该是什么样的?

[StructLayout(LayoutKind.Sequential, Size = 1), Serializable]
public struct SomeStruct
{
    [MarshalAs(UnmanagedType.I1)]
    public sbyte Field;
}

[StructLayout(LayoutKind.Sequential, Size = 1), Serializable]
public struct SomeStruct
{
    [MarshalAs(UnmanagedType.U1)]
    public byte Field;
}

我无法找到有关它是否为有符号字节的明确信息。 (它在C ++ struct definition中声明为'char')

UPD:这取决于C ++ lib是用GCC还是VS(默认编译器选项)构建的?如果没有,我可以希望在GCC和VS(默认编译器选项)上签署'char'

3 个答案:

答案 0 :(得分:3)

在Visual Studio和GCC中,charsigned by default/J编译器选项(GCC的-funsigned-char)可用于使其无符号。

所以答案取决于你的C ++项目中是否使用了该选项。

答案 1 :(得分:3)

通常,您无法判断{C}中char是否已签名或未签名。它取决于实现,并且通常可以通过选项配置单个编译器(实现)以使其成为任何一种方式。

最好的选择是尽可能在C ++代码中明确说明,即使用signed charunsigned char。然后,您可以根据需要选择sbytebyte进行C#编组。

答案 2 :(得分:1)

答案取决于您希望如何将值存储在C#中。你应该选择最方便的。

  • 如果将其作为无符号值存储在C#变量中,则将其封送为UnmanagedType.U1
  • 如果您将其作为有符号值存储在C#变量中,则将其封送为UnmanagedType.I1

关键是,一旦该字节越过模块边界,它就是重要的按位表示,而不是C#代码中的逻辑表示。一旦达到C ++代码,无符号值255就相当于有符号值-1。


当然,这假设您使用char作为字符类型。在对该问题的评论中,您声明您将其用作整数类型,在这种情况下,您需要决定是否对其进行签名并进行相应的编组。