问个关于C# MarshalAs 的问题 很郁闷

mcdjxiao 2010-01-14 11:15:55
问个关于C# MarshalAs 的问题 很郁闷
这个东西修饰到底修饰的是意思如何控制?我要将结构转换成流
public struct SuitBodyInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] key;
public int imgtype;//
public long suitstaraddress;
public long suitsize;

}
比如我修饰这个结构 里面的数组 SizeConst 设置的是不是写入流的字节数?
...全文
612 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jin20000 2010-01-14
  • 打赏
  • 举报
回复
没用过,以下摘自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 不支持泛型类型的封送处理。




godlxldog 2010-01-14
  • 打赏
  • 举报
回复
这个主要是控制一个结构体中的各成员应该如何在内存中布局,其实在struct上还有一个attribute,用来控制的.

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧