Metadatos y la estructura del archivo PE
Los metadatos se almacenan en una sección de un archivo ejecutable portable (PE) de .NET Framework, mientras que el lenguaje intermedio de Microsoft (MSIL) se guarda en otra sección del mismo archivo. La parte de los metadatos del archivo contiene una serie de estructuras de datos de tablas y montones. La parte del MSIL contiene símbolos (token) de MSIL y de metadatos que hacen referencia a la parte de metadatos del archivo PE. Se pueden encontrar símbolos de metadatos al utilizar herramientas como el Desensamblador de MSIL (Ildasm.exe) para ver el MSIL del código o el Depurador en tiempo de ejecución (Cordbg.exe) para realizar un volcado de memoria.
Tablas y montones de metadatos
Cada tabla de metadatos tiene información sobre los elementos del programa. Por ejemplo, una tabla de metadatos describe las clases del código, otra los campos, etc. Si hay diez clases en el código, la tabla de clases tendrá diez filas, una por clase. Las tablas de metadatos hacen referencia a otras tablas y montones. Por ejemplo, la tabla de metadatos de clases hace referencia a la tabla de métodos.
Los metadatos también almacenan información en cuatro estructuras de montón: cadena, objeto binario, cadena de usuario y GUID. Todas las cadenas usadas en los nombres de los tipos y los miembros se almacenan en el montón de cadenas. Por ejemplo, una tabla de métodos no almacena directamente el nombre de un método concreto, sino que señala al nombre del método almacenado en el montón de cadenas.
Símbolos (token) de metadatos
Cada fila de cada tabla de metadatos se identifica de forma exclusiva en la parte de MSIL del archivo PE mediante un símbolo de metadatos. Los símbolos de metadatos responden a un concepto similar a los punteros, que persisten en MSIL, que hacen referencia a una tabla de metadatos concreta.
Un símbolo de metadatos es un número de cuatro bytes. El byte superior indica la tabla de metadatos a la que se refiere un símbolo concreto (método, tipo, etc.). Los tres bytes restantes especifican la fila de la tabla de metadatos que corresponde al elemento de programación que se describe. Si se define un método en C# y se compila en un archivo PE, en la porción de MSIL del archivo PE podrían aparecer los símbolos de metadatos siguientes:
0x06000004
El byte superior (0x06
) indica que éste es un símbolo de MethodDef. Los tres bytes inferiores (000004
) indican a Common Language Runtime que busque en la cuarta fila de la tabla MethodDef la información que describe la definición de este método.
Metadatos en un archivo PE
Cuando se compila un programa para Common Language Runtime, se convierte en un archivo PE formado por tres partes. La tabla siguiente describe el contenido de cada una de estas partes.
Sección del archivo PE | Contenido de la sección del archivo PE |
---|---|
Encabezado del archivo PE |
El índice de las secciones principales del archivo PE y la dirección del punto de entrada. El motor en tiempo de ejecución usa esta información para identificar el archivo como archivo PE y para determinar dónde comienza la ejecución al cargar el programa en la memoria. |
Instrucciones MSIL |
Instrucciones del Lenguaje intermedio de Microsoft (MSIL) que contiene el código. Muchas de las instrucciones MSIL van acompañadas por símbolos de metadatos. |
Metadatos |
Tablas y montones de metadatos. El motor en tiempo de ejecución usa esta sección para registrar información sobre todos los tipos y miembros del código. Esta sección incluye también atributos personalizados e información de seguridad. |