Compartir a través de


IMetaDataEmit::DefineMethod (Método)

Este método puede usarse para crear una definición para un método o una función global con la signatura que se especifique y devolver un token a esa definición de método.

Sintaxis

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] El valor de este parámetro se corresponde con el token mdTypedef de la clase primaria o la interfaz primaria del método. Establezca el valor del parámetro td en mdTokenNil si va a definir una función global.

szName
[in] El valor de este parámetro se corresponde con el nombre de miembro en Unicode.

dwMethodFlags
[in] El valor de este parámetro se corresponde con uno de los valores de la enumeración CorMethodAttr, que se usa para especificar los atributos del método o la función global.

pvSigBlob
[in] El valor de este parámetro se corresponde con la signatura del método. La signatura se conservará en la forma en que se proporcione. Si necesita especificar información adicional para cualquier parámetro, use el método IMetaDataEmit::SetParamProps.

cbSigBlob
[in] El valor de este parámetro se corresponde con el recuento de bytes del valor del parámetro pvSigBlob.

ulCodeRVA
[in] El valor de este parámetro se corresponde con la dirección del código.

dwImplFlags
[in] El valor de este parámetro se corresponde con uno de los valores de la enumeración CorMethodImpl, que se usa para especificar las características de implementación del método.

pmd
[out] El valor de este parámetro se corresponde con el token de miembro.

Comentarios

Gracias a la API de metadatos, se garantiza que los métodos se conservarán en el mismo orden en que se emitan desde el llamador para su uso en la interfaz o clase envolvente determinada que se especifique en el parámetro td.

A continuación se proporciona información adicional sobre el uso y la configuración del método DefineMethod y de algunos de sus parámetros.

Ranuras de la tabla virtual

En el tiempo de ejecución, se usan definiciones de método para configurar las ranuras de la tabla virtual. En caso de que se deban omitir una o varias ranuras (por ejemplo, para conservar la paridad con un diseño de interfaz COM), debe definirse un método ficticio que ocupe esa ranura o esas ranuras de la tabla virtual. Para ello, establezca el parámetro dwMethodFlags con el valor mdRTSpecialName de la enumeración CorMethodAttr y especifique el nombre de la siguiente manera:

_VtblGap<SequenceNumber><_CountOfSlots>

En este nombre, el elemento SequenceNumber debe cambiarse por el número de secuencia del método y el elemento CountOfSlots debe cambiarse por el número de ranuras que se van a omitir en la tabla virtual. Si se omite el elemento CountOfSlots, se usará el valor 1. Estos métodos ficticios no se pueden llamar desde código administrado o no administrado y si se intenta llamarlos, ya sea desde código administrado o no administrado, se iniciará una excepción. Su única función consiste en ocupar espacio en la tabla virtual que se genera en el tiempo de ejecución para su uso en la integración COM.

Métodos duplicados

No debe definir métodos duplicados. Es decir, no se debe llamar al método DefineMethod si existe un conjunto duplicado de valores en los parámetros td, wzName y pvSig. (Estos tres parámetros se usan para definir al método de forma única). Sin embargo, sí se puede usar un triple duplicado siempre que, para una de las definiciones de método, se establezca el bit mdPrivateScope en el parámetro dwMethodFlags. (El bit mdPrivateScope se usa para que no se emita una referencia a esta definición de método en el compilador).

Información de implementación del método

La información sobre la implementación del método no suele conocerse en el momento en que se declara el método. Por lo tanto, no es necesario que se pasen valores en los parámetros ulCodeRVA y dwImplFlags cuando se llama al método DefineMethod. Los valores se pueden proporcionar más adelante, mediante los métodos IMetaDataEmit::SetMethodImplFlags o IMetaDataEmit::SetRVA, según corresponda.

En algunas situaciones, como la invocación de plataforma (PInvoke) o en los escenarios de interoperabilidad COM, no se proporcionará el cuerpo del método y el valor del parámetro ulCodeRVA deberá establecerse en cero. En estas situaciones, el método no debe etiquetarse como abstracto, ya que la implementación se localizará en el tiempo de ejecución.

Definición de un método para PInvoke

Para permitir que se llame a cada función no administrada a través de la funcionalidad PInvoke, deberá definirse un método administrado en el que se represente la función no administrada de destino. Para definir el método administrado, use el método DefineMethod tras haber establecido algunos de los parámetros en determinados valores, en función de la forma en que vaya a usar PInvoke:

  • PInvoke real: implica la invocación de un método externo no administrado que reside en un archivo DLL no administrado.

  • PInvoke local: implica la invocación de un método nativo no administrado que está insertado en el módulo administrado actual.

Los valores del parámetro se muestran en la tabla siguiente.

Parámetro Valores para PInvoke real Valores para PInvoke local
dwMethodFlags Establezca el valor mdStatic; borre los valores mdSynchronized y mdAbstract.
pvSigBlob Establezca como valor una signatura de método válida de Common Language Runtime (CLR) con parámetros que sean tipos administrados válidos. Establezca como valor una signatura de método válida de CLR con parámetros que sean tipos administrados válidos.
ulCodeRVA 0
dwImplFlags Establezca miCil y miManaged. Establezca miNative y miUnmanaged.

Requisitos

Plataformas: Vea Requisitos de sistema.

Encabezado: Cor.h

Biblioteca: usada como recurso en MSCorEE.dll

Versiones de .NET Framework: está disponible desde la versión 1.0

Consulte también