c# - significado - código il
¿Dónde se encuentra exactamente.NET Runtime(CLR), el compilador JIT? (3)
Esta pregunta puede parecer un poco tonta o extraña, pero he escuchado muchas cosas sobre .NET CLR, el compilador JIT y cómo funciona bla, bla, bla ... Pero ahora me pregunto dónde está ubicado o alojado exactamente.
Lo es -
- Alojado como parte del sistema operativo de Windows cuando realmente instalamos .NET Framework?
O
- Es una parte de algún archivo .exe que podemos ver en el administrador de tareas.
Estoy buscando la respuesta detallada sobre esto. Alguien podría encuadrar esta pregunta como "¿Cómo el sistema operativo Windows activa / ejecuta el ejecutable .NET dentro de .NET Runtime?
¿Cómo el sistema operativo Windows activa / ejecuta ejecutables ejecutables .NET dentro de .NET Runtime?
Cada ensamblado o ejecutable administrado por .NET tiene encabezados CLR especiales, que puede ver al ver el ensamblaje en ILDASM. Estos encabezados apuntan a la versión del tiempo de ejecución que debe cargarse. Además, está la Sección de imágenes con la Import Address Table
, que apunta a lo que se debe cargar:
----- Image sections:
Import Address Table
DLL : mscoree.dll
0x00002000 Import Address Table
0x0000a37e Import Name Table
0 Time Date Stamp
0 Index of First Forwarder Reference
0x0000 _CorDllMain
----- CLR Header:
Header size: 0x00000048
Major runtime version: 0x0002
Minor runtime version: 0x0005
0x00003184 [0x00007078] address [size] of Metadata Directory:
Flags: 0x00000001
Entry point token: 0x00000000
0x00000000 [0x00000000] address [size] of Resources Directory:
0x00000000 [0x00000000] address [size] of Strong Name Signature:
0x00000000 [0x00000000] address [size] of CodeManager Table:
0x00000000 [0x00000000] address [size] of VTableFixups Directory:
0x00000000 [0x00000000] address [size] of Export Address Table:
0x00000000 [0x00000000] address [size] of Precompile Header:
Cuando se ejecuta mediante el sistema operativo, se mscoree.dll
(o The Shim), y es el bootstrapper de clr.dll
y clrjit.dll
para .NET 4.0 y superior, o mscordacwks.dll
y mscorjit.dll
para .NET 2.0 o abajo, que son el tiempo de ejecución y el JIT, respectivamente. Puede ver que se instruye al punto de entrada de dll nativo para que sea el método _CorDllMain
para una biblioteca de clases, y _CorExeMain
para un ejecutable, que es responsable de la carga y el ajuste del punto de entrada. Ellos, a su vez, llamarán al punto de entrada de sus aplicaciones, en el entorno administrado.
donde está ubicado o alojado exactamente
Es solo una DLL simple, encontrará de nuevo la versión x86 en C: / Windows / Microsoft.NET / Framework / v4.0.30319 / clrjit.dll. La versión x64 está en el directorio Framework64. La versión .NET v2 tenía un nombre diferente, mscorjit.dll, lo encuentra nuevamente en los directorios v2.0.50727.
No está "alojado" en absoluto, el sistema operativo desconoce por completo que existe. El CLR sabe cómo ubicarlo y cargarlo. Necesariamente, es el CLR el que decide cuándo iniciar un programa. Simplemente tiene el nombre de la DLL codificado y usa LoadLibrary ("clrjit.dll") para cargarlo, GetProcAddress ("getJit") para obtener la función de fábrica. Algo que se puede ver en el código fuente de CoreCLR, aunque el jitter ya no es una DLL separada en esa versión de CLR.
También puede ver el CLR con Explorer, de nuevo, solo una DLL simple. Es clr.dll en las versiones v4, mscorwks.dll y mscorsvc.dll en las versiones v2. Dos diferentes en aquel entonces con diferentes recolectores de basura, "wks" es la versión de la estación de trabajo, "svc" es la versión del servidor. Compare con la entrada del archivo de configuración <gcServer>
.
¿Qué mueve la pregunta a "cómo se carga el CLR?" Ese es el trabajo de c: / windows / syswow64 / mscoree.dll, usarás c: / windows / system32 / mscoree.dll cuando apuntas a x64 en tu proyecto EXE. Cada ensamblaje .NET tiene 5 o 9 bytes de código no administrado, un salto a esa DLL. O bien _CorExeMain o _CorDllMain, dependiendo de si el ensamblaje se creó como un archivo ejecutable o una biblioteca. mscoree.dll echa un vistazo a los metadatos en el ensamblaje y decide qué versión de CLR debe cargarse para que pueda ejecutarse correctamente.
Pasan muchos más chanchullos, acabo de publicar la vista de los 10,000 pies que pediste. Si esto le interesa, entonces probablemente desee obtener más información sobre el alojamiento CLR personalizado para ver al hombre detrás de la cortina.
Esto se basa en mi comprensión y lo guiará hacia su respuesta, pero es posible que no se vacíe por completo.
Los archivos EXE / DLL que conforman el tiempo de ejecución de DotNet (CLR, etc.) se encuentran en las siguientes ubicaciones:
C:/Windows/Microsoft.NET/Framework // for the 32 bit runtime
C:/Windows/Microsoft.NET/Framework64 // for the 64 bit runtime
Dentro de ahí, tiene diferentes ediciones, como 2.0.50727, 3.0, 3.5 y 4.0.30319 (versiones en mi sistema hoy).
Aquí es donde se encuentran y ejecutan MSBuild, así como los archivos que están registrados con IIS.
No sé si esto termina siendo alojado por Windows en tiempo de ejecución, o si hay un EXE real al que se puede adjuntar con un depurador y ver en el administrador de tareas.
Esperemos que esto te brinde más información.