为具有指定签名的方法或全局函数创建定义,并将令牌返回到该方法定义。
Syntax
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
);
Parameters
td [in] mdTypedef 方法的父类或父接口的标记。 如果正在定义全局函数,则设置为 <
szName [in]Unicode 中的成员名称。
dwMethodFlags [in] CorMethodAttr 枚举的值,指定方法或全局函数的属性。
pvSigBlob [in]方法签名。 签名将保留为提供。 如果需要为任何参数指定其他信息,请使用 IMetaDataEmit::SetParamProps 方法。
cbSigBlob [in]字节 pvSigBlob的计数。
ulCodeRVA [in]代码的地址。
dwImplFlags [in] CorMethodImpl 枚举的值,指定方法的实现功能。
pmd [out]成员令牌。
Remarks
元数据 API 保证按照调用方为在参数中指定的 td 给定封闭类或接口发出方法的顺序保留方法。
下面提供了有关使用 DefineMethod 和特定参数设置的其他信息。
V-table 中的槽
运行时使用方法定义来设置 v 表槽。 在需要跳过一个或多个槽(例如保留与 COM 接口布局的奇偶校验)的情况下,将定义虚拟方法以占用 v 表中的槽或槽;设置 dwMethodFlagsCorMethodAttrmdRTSpecialName 枚举的值,并将名称指定为:
<_VtblGapSequenceNumber><_CountOfSlots>
其中 SequenceNumber 是方法的序列号, CountOfSlots 是要在 v 表中跳过的槽数。 如果省略 CountOfSlots ,则假定为 1。 这些虚拟方法不能从托管或非托管代码调用,并且任何尝试从托管代码或非托管代码调用它们将生成异常。 它们的唯一目的是占用运行时为 COM 集成生成的 v 表中的空间。
Duplicate Methods
不应定义重复的方法。 也就是说,不应在 <dwMethodFlags设置mdPrivateScope位。 (位 mdPrivateScope 表示编译器不会发出对此方法定义的引用。
方法实现信息
在声明方法时,通常不知道有关方法实现的信息。 因此,调用时DefineMethod无需在参数dwImplFlags中ulCodeRVA传递值。 稍后可以通过 IMetaDataEmit::SetMethodImplFlags 或 IMetaDataEmit::SetRVA 根据需要提供这些值。
在某些情况下,例如平台调用(PInvoke)或 COM 互作方案,不会提供方法正文,并且 ulCodeRVA 应设置为零。 在这些情况下,不应将该方法标记为抽象,因为运行时将查找实现。
定义 PInvoke 的方法
对于要通过 PInvoke 调用的每个非托管函数,必须定义一个表示目标非托管函数的托管方法。 若要定义托管方法,请使用 DefineMethod 一些设置为特定值的参数,具体取决于使用 PInvoke 的方式:
True PInvoke - 涉及调用驻留在非托管 DLL 中的外部非托管方法。
本地 PInvoke - 涉及调用嵌入在当前托管模块中的本机非托管方法。
下表提供了参数设置。
| Parameter | true PInvoke 的值 | 本地 PInvoke 的值 |
|---|---|---|
dwMethodFlags |
设置 mdStatic;清除 mdSynchronized 和 mdAbstract。 |
|
pvSigBlob |
具有有效托管类型的参数的有效公共语言运行时 (CLR) 方法签名。 | 具有有效托管类型的参数的有效 CLR 方法签名。 |
ulCodeRVA |
0 | |
dwImplFlags |
设置 miCil 和 miManaged。 |
设置 miNative 和 miUnmanaged。 |
Requirements
平台: 请参阅 .NET 支持的作系统。
Header: Cor.h
Library: CorGuids.lib