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<序列号><_槽数>
其中,序列号 是方法的序列号,槽数 是要在 v-表中跳过的槽数。 如果省略 槽数,则假定槽数为 1。 无论通过托管代码还是非托管代码,都无法调用这些虚方法,对这些方法进行的任何调用尝试(无论使用托管代码还是非托管代码)都将生成异常。 它们的唯一用途是占用运行时为 COM 集成生成的 v-表中的空间。
重复的方法
不应定义重复的方法。 即,在调用 DefineMethod 时,不应使用重复的 td、wzName 和 pvSig 参数 (这三个参数一起唯一地定义方法)值集合。 但是,如果满足以下条件,则可以使用这三个参数值的重复集合:对于其中的一个方法定义,在 dwMethodFlags 参数中设置 mdPrivateScope 位 (mdPrivateScope 位表示编译器将不发出对此方法定义的引用)。
方法实现信息
在声明方法时,有关方法实现的信息通常是未知的。 因此,在调用 DefineMethod 时,不需要传递 ulCodeRVA 和 dwImplFlags 参数中的值。 这些值在以后可根据需要通过 IMetaDataEmit::SetMethodImplFlags 或 IMetaDataEmit::SetRVA 提供。
在某些情况下(例如平台调用 (PInvoke) 或 COM 互操作方案),将不提供方法体,并且应将 ulCodeRVA 设置为零。 对于这些情况,不应将方法标记为抽象方法,因为运行时将查找其实现。
定义用于 PInvoke 的方法
对于每个要通过 PInvoke 调用的非托管函数,必须定义表示目标非托管函数的托管方法。 若要定义托管方法,请使用 DefineMethod 并将某些参数设置为特定值,具体则取决于 PInvoke 的用法:
真正 PInvoke - 涉及调用驻留在非托管 DLL 中的外部非托管方法。
本地 PInvoke — 涉及调用嵌入在当前托管模块中的本机非托管方法。
下表给出了相应的参数设置。
Parameter |
真正 PInvoke 的值 |
本地 PInvoke 的值 |
---|---|---|
dwMethodFlags |
设置 mdStatic;清除 mdSynchronized 和 mdAbstract。 |
|
pvSigBlob |
一个有效的公共语言运行时 (CLR) 方法签名,其参数属于有效的托管类型。 |
一个有效的 CLR 方法签名,其参数属于有效的托管类型。 |
ulCodeRVA |
0 |
|
dwImplFlags |
设置 miCil 和 miManaged。 |
设置 miNative 和 miUnmanaged。 |
要求
**平台:**请参见 .NET Framework 系统要求。
**头文件:**Cor.h
**库:**在 MSCorEE.dll 中用作资源
**.NET Framework 版本:**4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1、1.0