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?

¿Fue útil?

Solución

Cuando se compila en VS

  1. 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).
  2. 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)
  3. .
  4. 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:

  1. El bootstraper inicializa el CLR (principalmente por la carga de la asamblea mscorlib) y le indica que debe ejecutar su montaje.
  2. El CLR ejecuta su entrada principal.
  3. 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.
  4. 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.
  5. 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.
  6. Por último, el JIT se encarga de la ejecución hacia el código compilado.
  7. 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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top