Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Crea una definición para un método o una función global con la firma especificada y devuelve un símbolo (token) a dicha definición.
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
);
Parámetros
td
[in] Símbolo (token) mdTypedef de la clase o interfaz primaria del método. Establezca td en mdTokenNil si está definiendo una función global.szName
[in] Nombre del miembro en Unicode.dwMethodFlags
[in] Valor de la enumeración CorMethodAttr que especifica los atributos del método o de la función global.pvSigBlob
[in] Firma del método. La firma se conserva tal como se proporciona. Si necesita especificar información adicional para cualquier parámetro, utilice el método IMetaDataEmit::SetParamProps.cbSigBlob
[in] Recuento de bytes en pvSigBlob.ulCodeRVA
[in] Dirección del código.dwImplFlags
[in] Valor de la enumeración CorMethodImpl que especifica las características de implementación del método.pmd
[out] Símbolo (token) del miembro.
Comentarios
La API de metadatos garantiza que se conserven los métodos en el mismo orden en que los emite el llamador para una clase o interfaz envolvente, que se especifica en el parámetro td.
La información adicional con respecto al uso de DefineMethod y la configuración determinada de los parámetros se proporciona a continuación.
Ranuras en la v-table
El motor en tiempo de ejecución utiliza definiciones de métodos para configurar ranuras de v-table. Si es necesario omitir una o más ranuras para, por ejemplo, conservar la paridad con un diseño de la interfaz COM, se define un método ficticio que ocupe la ranura o ranuras en v-table; establezca dwMethodFlags en el valor mdRTSpecialName de la enumeración CorMethodAttr y especifique el nombre como:
_VtblGap <númeroDeSecuencia> < _recuentoDeRanuras>
donde númeroDeSecuencia es el número de secuencia del método y recuentoDeRanuras es el número de ranuras que se omiten en la v-table. Si se omite RecuentoDeRanuras, se supone que es 1. Estos métodos ficticios no son invocables desde código administrado ni desde código no administrado y cualquier intento de llamada, desde uno u otro, producirá una excepción. Su único propósito es ocupar el espacio en la v-table que el motor en tiempo de ejecución genera para la integración COM.
Métodos duplicados
No debería definir los métodos duplicados. Es decir, no debería llamar a DefineMethod con un conjunto duplicado de valores en los parámetros td, wzName y pvSig. Estos tres parámetros juntos definen de forma exclusiva el método. Sin embargo, puede utilizar un triple duplicado con tal de que, para una de las definiciones de método, establezca el bit mdPrivateScope en el parámetro dwMethodFlags. El bit mdPrivateScope significa que el compilador no emitirá una referencia a esta definición del método.
Información de implementación del método
Con frecuencia, la información sobre la implementación del método no se conoce en el momento que se declara el método. Por consiguiente, no necesita pasar los valores en los parámetros ulCodeRVA y dwImplFlags al llamar a DefineMethod. Los valores se pueden proporcionar después mediante IMetaDataEmit::SetMethodImplFlags o IMetaDataEmit::SetRVA, según corresponda.
En algunas situaciones, como en la invocación de plataforma (PInvoke) o en casos de interoperabilidad COM, el cuerpo del método no se proporcionará y ulCodeRVA debería establecerse en cero. En estas situaciones, el método no se debería etiquetar como abstracto, porque el motor en tiempo de ejecución buscará la implementación.
Definir un método para PInvoke
Para cada función no administrada que se vaya a llamar a través de PInvoke, debe definir un método administrado que represente la función no administrada de destino. Para definir el método administrado, utilice DefineMethod con algún parámetro establecido en determinados valores, dependiendo del modo en que se use PInvoke:
PInvoke verdadero - implica la invocación de un método no administrado externo que reside en un archivo DLL no administrado.
PInvoke local: implica la invocación de un método no administrado nativo que está incrustado en el módulo administrado actual.
La configuración de los parámetros se proporciona en la tabla siguiente.
Parámetro |
Valores de PInvoke verdadero |
Valores de PInvoke local |
---|---|---|
dwMethodFlags |
Establezca mdStatic; borre mdSynchronized y mdAbstract. |
|
pvSigBlob |
Una firma de método de Common Language Runtime (CLR) válida con parámetros que son tipos administrados válidos. |
Una firma de método CLR válida con parámetros que son tipos administrados válidos. |
ulCodeRVA |
0 |
|
dwImplFlags |
Establezca miCil y miManaged. |
Establezca miNative y miUnmanaged. |
Requisitos
Plataformas: vea Requisitos de sistema de .NET Framework.
Encabezado: Cor.h
Biblioteca: Se usa como recurso en MSCorEE.dll
Versiones de .NET Framework: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0