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 表中占用空间。

重复方法

不应定义重复的方法。 也就是说,不应使用 tdwzNamepvSig 参数中一组重复的值来调用 DefineMethod。 (这三个参数一起唯一定义方法)。 不过,你可以使用重复的三个值,前提是对于其中一个方法定义,在 dwMethodFlags 参数中设置 mdPrivateScope 位。 (mdPrivateScope 位意味着编译器不会发出对此方法定义的引用。)

方法实现信息

在声明方法时,有关方法实现的信息通常是未知的。 因此,在调用 DefineMethod 时,不需要在 ulCodeRVAdwImplFlags 参数中传入值。 可以在以后根据需要通过 IMetaDataEmit::SetMethodImplFlagsIMetaDataEmit::SetRVA 来提供值。

在某些情况下(例如平台调用 (PInvoke) 或 COM 互操作方案),将不提供方法主体,因此 ulCodeRVA 应设置为零。 在这些情况下,不应将方法标记为抽象方法,因为运行时将找到实现。

为 PInvoke 定义方法

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

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

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

下表给出了参数设置。

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

要求

平台:请参阅系统要求

标头:Cor.h

库:用作 MSCorEE.dll 中的资源

.NET Framework 版本:自 1.0 起可用

另请参阅