问个关于C# MarshalAs 的问题 很郁闷
这个东西修饰到底修饰的是意思如何控制?我要将结构转换成流
public struct SuitBodyInfo
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public byte[] key;           
            public int imgtype;//          
            public long suitstaraddress;
            public long suitsize;        }
比如我修饰这个结构 里面的数组   SizeConst 设置的是不是写入流的字节数?

解决方案 »

  1.   

    没用过,以下摘自MSDN:可将该属性应用于参数、字段或返回值。该属性为可选属性,因为每个数据类型都有默认的封送处理行为。仅在可以将给定类型封送到多个类型时需要此属性。例如,可将字符串作为 LPStr、LPWStr、LPTStr 或 BStr 封送到非托管代码。默认情况下,公共语言运行库将字符串参数作为 BStr 封送到 COM 方法。可将 MarshalAsAttribute 属性应用于个别的字段或参数,使该字符串作为 LPStr 而不是 BStr 进行封送。类型库导出程序 (Tlbexp.exe) 将封送处理首选项传递给公共语言运行库。当用于 COM interop 或平台调用时,某些参数和返回值将具有不同的默认封送处理行为。默认情况下,运行库将字符串参数(以及值类型中的字段)作为 LPStr 封送到平台调用方法或函数。有关更多信息,请参见 默认封送处理行为。大多数情况下,该属性只是使用 UnmanagedType 枚举标识非托管数据的格式,如下面的 C# 签名所示: 
    void
        MyMethod([MarshalAs(LPStr)] String s);
     某些 UnmanagedType 枚举成员需要附加信息。例如,当 UnmanagedType 为 LPArray 时需要附加信息。有关如何将此属性用于数组的完整说明,请参见 数组的默认封送处理。类型库导入程序 (Tlbimp.exe) 还将此属性应用于参数、字段及返回值,以指示输入类型库中的数据类型不是相应托管数据类型的默认类型。为清楚起见,Tlbimp.exe 始终将 MarshalAsAttribute 应用于 String 和 Object 类型,而不管在输入类型库中指定的是何种类型。注意 
    MarshalAsAttribute 不支持泛型类型的封送处理。
     
      

  2.   

    这个主要是控制一个结构体中的各成员应该如何在内存中布局,其实在struct上还有一个attribute,用来控制的.