应用自定义属性来标记非托管 COM Get/Set 特性
非托管 COM 接口可以是通过 Item 方法访问枚举的可枚举对象。 在 .NET Framework 中,此方法被指定为 .Item。 正确访问此方法的唯一方法是通过 IDL 文件中的特性将该项目标记为 propget,但这样做将会更改类型库中函数的签名。 您可以在导入时使用此 custom 特性将该方法标记为 propget。 custom 特性的语法如下:
GUID = 2941ff83-88d8-4f73-b6a9-bdf8712d000d // for propget
此外,您可以在导入时使用其他 custom 特性将方法标记为 propput。 此 custom 特性的语法如下:
GUID = 29533527-3683-4364-abc0-db1add822fa2 // for propput
请注意,此 custom 特性只能应用于方法。 另外,以下规则也适用:
一次只能应用一个特性;如果应用多个特性,则忽略除第一个之外的所有特性。
对于 propget,custom 特性忽略所有没有返回值的方法签名。
对于 propput,custom 特性忽略所有不使用输入参数(参数可以使用 [in] 或 [out] 加以标记,但不能使用 [out,retval] 加以标记)的方法签名,并且还忽略所有具有返回值的签名。
对于 propget 和 propput,如果它们与 id(-4) 或自定义 dispid(-4) 一起使用,则 custom 特性忽略 GetEnumerator 方法。
当使用 Tlbimp.exe 导入类型库时,始终在将 custom 特性应用到只支持调度的接口(调度接口)后使用 /transform:dispret 开关。
示例
下面以接口定义语言 (IDL) 编写的示例演示如何使用 propget 特性:
[custom(2941ff83-88d8-4f73-b6a9-bdf8712d000d, ""), id(6)]
HRESULT cget(int i, [out, retval] short *pVal);
下面的示例演示如何使用 propput 特性:
[custom(29533527-3683-4364-abc0-db1add822fa2, ""), id(7)]
HRESULT cset([in] int i);