应用自定义特性以改写默认 COM 调度标识符 (DISPID)

非托管 COM 中的调度接口具有一个默认成员(DISPID_VALUE 或 0),当缺少指定的 DISPID 时,会调用该成员。 .NET Framework 无法引用默认方法或属性;因此,在导入时,您可以使用此 custom 特性将任意 DISPID 指定为默认成员。 此 custom 特性的语法如下:

GUID = CD2BC5C9-F452-4326-B714-F9C539D4DA58
Value = number indicating the default DISPID

示例

下面的示例是用接口定义语言 (IDL) 编写的,它演示如何使用 custom DISPID 特性来指定在导入时使用 DISPID 为 2 的成员 method1 作为默认成员。

[
   object,
   uuid(5EA05866-2E49-421C-BE47-FF62C5B9504E),
   dual,
   helpstring("IMyClass Interface"),
   pointer_default(unique)
]
interface IMyClass : IDispatch
{
   // Use the default dispID.
   [custom(CD2BC5C9-F452-4326-B714-F9C539D4DA58, 0), id(2), helpstring("method method1")] HRESULT method1();
};
[
   uuid(186D98EE-6750-42B9-947D-B82CF4A94600),
   helpstring("MyClass Class")
]
coclass MyClass
{
   [default] interface IMyClass;
};

导入类型库后,最终得到的 MSIL 看上去类似下面这样:

.method public hidebysig newslot abstract virtual 
instance void  method1() runtime managed internalcall
{
.custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 ) 
} // This is the end of method IMyClass::method1.

请参见

参考

TypeLibConverter

ITypeLibConverter

Tlbimp.exe(类型库导入程序)

概念

应用自定义特性实现 IEnumerable

应用自定义属性来标记非托管 COM Get/Set 特性

将类型库当作程序集导入