¿Cómo y cuándo .NET realidad compilar código?
-
11-09-2019 - |
Pregunta
Digamos que escribir una aplicación en C #, VB, cualquier cosa con .NET Al llegar a construir, es lo que realmente compilar el código? Eso pensé, hasta que empecé a usar Redgates reflector en algunas de mis montajes y vi mi código pie de la letra. Lo que habría esperado espiras que se desenrolla y otra gran cantidad de optimizaciones, en vez nada.
Así que cuando llega la compilación realmente sucede? Creo que cuando se construye, se convierten en código IL (Intermediario Language) y cuando se produce la ejecución, que se carga en el CLR? Se optimizó durante CLR única y nunca en tiempo de compilación?
Solución
Cuando se compila en VS
- El código fuente se compila en un código de bytes conocido como el lenguaje intermedio común (CIL) o MSIL (Microsoft Intermediate Language).
- metadatos de cada clase y cada métodos (y cada otra cosa: O) está incluido en el encabezado de PE del ejecutable resultante (ya sea un DLL o un EXE) .
- Si usted está produciendo un ejecutable la cabecera PE también incluye un programa previo convencional, que se encarga de cargar el CLR (Common Language Runtime) cuando se ejecuta ejecutable.
Al ejecutar:
- El bootstraper inicializa el CLR (principalmente por la carga de la asamblea mscorlib) y le indica que debe ejecutar su montaje.
- El CLR ejecuta su entrada principal.
- Ahora, las clases tienen una tabla de vectores que mantienen las direcciones de las funciones de los métodos, de manera que cuando se llama a MiMetodo, esta tabla es buscada y luego se realiza una llamada correspondiente a la dirección. Al principio todas las entradas para todas las tablas tienen la dirección del compilador JIT.
- Cuando se realiza una llamada a uno de tal método, el JIT se invoca en lugar del método actual y toma el control. El JIT entonces compila el código CIL en código montaje real para la arquitectura apropiada.
- Una vez que el código se compila el JIT entra en la tabla de métodos de vectores y sustituye a la dirección con la del código compilado, de modo que cada llamada posterior ya no se invoca el JIT.
- Por último, el JIT se encarga de la ejecución hacia el código compilado.
- Si se llama a otro método que aún no han de ser compilado a continuación, volver a 4 ... y así sucesivamente ...
puedo enviar la respuesta aquí también como la otra cuestión no era realmente sobre esto ...
Otros consejos
Se compila a IL en, así, el tiempo de compilación. La magia de reflector es que "entiende" la IL y la convierte de nuevo en C # (o VB.NET o lo que sea. Busque en el menú Opciones de reflector y se puede ver el montaje en cualquier formato, incluyendo la IL).
En reflector, en realidad se está viendo no su código original. Usted está viendo una traducción de la IL en C #. La mayor parte del tiempo que va a ser muy similar a lo que ha escrito, pero hay algunos signos reveladores - por ejemplo, encontrar un lugar donde se implementó un auto-propiedad :
string MyProperty {get;set;}
Y verás lo que realmente compila a, que es algo como esto:
public string MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}