IMetaDataEmit::DefineMethod 方法
为具有指定签名的方法或全局函数创建定义,并向该方法定义返回一个标记。
语法
HRESULT DefineMethod (
[in] mdTypeDef td,
[in] LPCWSTR szName,
[in] DWORD dwMethodFlags,
[in] PCCOR_SIGNATURE pvSigBlob,
[in] ULONG cbSigBlob,
[in] ULONG ulCodeRVA,
[in] DWORD dwImplFlags,
[out] mdMethodDef *pmd
);
参数
td
[in] 该方法的父类或父接口的 mdTypedef
标记。 如果要定义全局函数,请将 td
设置为 mdTokenNil
。
szName
[in] Unicode 中的成员名称。
dwMethodFlags
[in] CorMethodAttr 枚举的一个值,该值指定该方法或全局函数的特性。
pvSigBlob
[in] 方法签名。 签名按提供的方式持久保存。 如果需要指定任何参数的附加信息,请使用 IMetaDataEmit::SetParamProps 方法。
cbSigBlob
[in] pvSigBlob
中的字节计数。
ulCodeRVA
[in] 代码地址。
dwImplFlags
[in] CorMethodImpl 枚举的一个值,该值指定方法的实现功能。
pmd
[out] 成员标记。
注解
元数据 API 保证按调用方为给定的封闭类或接口(这是在参数 td
中指定的)发出方法的相同顺序来永久保持方法。
下面给出了有关使用 DefineMethod
和特定参数设置的其他信息。
V 表中的槽
运行时使用方法定义设置 v 表槽。 如果需要跳过一个或多个槽,例如使用 COM 接口布局保留奇偶校验,则会定义一个虚方法,用于在 v 表中占据槽;将 dwMethodFlags
设置为 CorMethodAttr 枚举的值 mdRTSpecialName
,并将名称指定为:
_VtblGap<SequenceNumber><_CountOfSlots>
其中 SequenceNumber 是方法的序列号,CountOfSlots 是要在 v 表中跳过的槽数。 如果省略 CountOfSlots,则假定为 1。 不能从托管或非托管代码中调用这些虚方法,任何从托管或非托管代码调用它们的尝试都将生成异常。 它们唯一目的是在运行时为 COM 集成生成的 v 表中占用空间。
重复方法
不应定义重复的方法。 也就是说,不应使用 td
、wzName
和 pvSig
参数中一组重复的值来调用 DefineMethod
。 (这三个参数一起唯一定义方法)。 不过,你可以使用重复的三个值,前提是对于其中一个方法定义,在 dwMethodFlags
参数中设置 mdPrivateScope
位。 (mdPrivateScope
位意味着编译器不会发出对此方法定义的引用。)
方法实现信息
在声明方法时,有关方法实现的信息通常是未知的。 因此,在调用 DefineMethod
时,不需要在 ulCodeRVA
和 dwImplFlags
参数中传入值。 可以在以后根据需要通过 IMetaDataEmit::SetMethodImplFlags 或 IMetaDataEmit::SetRVA 来提供值。
在某些情况下(例如平台调用 (PInvoke) 或 COM 互操作方案),将不提供方法主体,因此 ulCodeRVA
应设置为零。 在这些情况下,不应将方法标记为抽象方法,因为运行时将找到实现。
为 PInvoke 定义方法
对于要通过 PInvoke 调用的每个非托管函数,必须定义一个表示目标非托管函数的托管方法。 若要定义托管方法,请使用 DefineMethod
,将其中某些参数设置为特定值,具体取决于使用 PInvoke 的方式:
True PInvoke - 涉及调用驻留在非托管 DLL 中的外部非托管方法。
本地 PInvoke - 涉及调用嵌入在当前托管模块中的本机非托管方法。
下表给出了参数设置。
参数 | 适用于 true PInvoke 的值 | 适用于本地 PInvoke 的值 |
---|---|---|
dwMethodFlags |
设置 mdStatic ;清除 mdSynchronized 和 mdAbstract 。 |
|
pvSigBlob |
有效的公共语言运行时 (CLR) 方法签名,其参数是有效的托管类型。 | 参数是有效托管类型的有效 CLR 方法签名。 |
ulCodeRVA |
0 | |
dwImplFlags |
设置 miCil 和 miManaged 。 |
设置 miNative 和 miUnmanaged 。 |
要求
平台:请参阅系统要求。
标头:Cor.h
库:用作 MSCorEE.dll 中的资源
.NET Framework 版本:自 1.0 起可用