111,120
社区成员
发帖
与我相关
我的任务
分享
可将该属性应用于参数、字段或返回值。
该属性为可选属性,因为每个数据类型都有默认的封送处理行为。仅在可以将给定类型封送到多个类型时需要此属性。例如,可将字符串作为 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 不支持泛型类型的封送处理。