IMetaDataEmit::DefineMethod Method

为具有指定签名的方法或全局函数创建定义,并将令牌返回到该方法定义。

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 方法的父类或父接口的标记。 如果正在定义全局函数,则设置为 <a0/a0;。

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

不应定义重复的方法。 也就是说,不应在 <a0/> 和参数中使用重复的值集进行调用。 (这三个参数一起唯一定义方法)。 但是,可以使用重复的三倍,前提是,对于其中一个方法定义,可以在参数中dwMethodFlags设置mdPrivateScope位。 (位 mdPrivateScope 表示编译器不会发出对此方法定义的引用。

方法实现信息

在声明方法时,通常不知道有关方法实现的信息。 因此,调用时DefineMethod无需在参数dwImplFlagsulCodeRVA传递值。 稍后可以通过 IMetaDataEmit::SetMethodImplFlagsIMetaDataEmit::SetRVA 根据需要提供这些值。

在某些情况下,例如平台调用(PInvoke)或 COM 互作方案,不会提供方法正文,并且 ulCodeRVA 应设置为零。 在这些情况下,不应将该方法标记为抽象,因为运行时将查找实现。

定义 PInvoke 的方法

对于要通过 PInvoke 调用的每个非托管函数,必须定义一个表示目标非托管函数的托管方法。 若要定义托管方法,请使用 DefineMethod 一些设置为特定值的参数,具体取决于使用 PInvoke 的方式:

  • True PInvoke - 涉及调用驻留在非托管 DLL 中的外部非托管方法。

  • 本地 PInvoke - 涉及调用嵌入在当前托管模块中的本机非托管方法。

下表提供了参数设置。

Parameter true PInvoke 的值 本地 PInvoke 的值
dwMethodFlags 设置 mdStatic;清除 mdSynchronizedmdAbstract
pvSigBlob 具有有效托管类型的参数的有效公共语言运行时 (CLR) 方法签名。 具有有效托管类型的参数的有效 CLR 方法签名。
ulCodeRVA 0
dwImplFlags 设置 miCilmiManaged 设置 miNativemiUnmanaged

Requirements

平台: 请参阅 .NET 支持的作系统

Header: Cor.h

Library: CorGuids.lib

See also