Conjuntos.NET y rebase de DLL
assemblies rebasing (2)
De acuerdo con este artículo, la rebase no es necesaria para los ensamblados .NET debido a la compilación JIT del código. El artículo dice:
"El código compilado JIT no tiene un problema de rebase, ya que las direcciones se generan en tiempo de ejecución en función de dónde se coloca el código en la memoria. Además, MSIL rara vez se ve afectado por fallas en la dirección base ya que las referencias MSIL están basadas en tokens, en lugar de direcciones En consecuencia, cuando se usa el compilador JIT, el sistema es resistente a las colisiones de direcciones base.
Sin embargo, me he dado cuenta de que VS2008 asigna la dirección base predeterminada 0x0400000 a todos los ensambles (propiedades del proyecto> compilar> avanzado) y si hago una listdlls /r
para mi proceso todos mis ensamblados .NET son de hecho actualizados de manera predeterminada.
Si asigno direcciones yo mismo, no se realiza ninguna rebase.
Mi pregunta es: ¿qué se basa en este caso y por qué?
EDITAR: Debo añadir que no estoy hablando de asambleas NGen''ed.
¿Qué SO estás ejecutando? Sé que la vista y más allá introdujo ASLR que aleatoriza el espacio de direcciones en el que carga dlls. Esto sucede para los archivos DLL del sistema, pero no estoy seguro acerca de .net, tal vez algo en que mirar.
El mecanismo de carga de CLR utiliza LoadLibrary detrás de escena, por lo que esto es lo que observa: 2 ensamblajes no se pueden cargar en la misma dirección. Ahora lo que las personas suelen decir cuando intentan volver a establecer una base de datos de un dll es evitar el perf. éxito de las reparaciones, por ejemplo, las direcciones absolutas y las llamadas a funciones deben ser "reubicadas" con la dirección base cargada. CLR no tiene este problema (no estoy seguro acerca de los datos estáticos en la aplicación, que es la segunda parte de esas reparaciones, necesitaría leer sobre esto), porque el código MSIL se carga bajo demanda cuando se llama a una función en el código administrado El MSIL luego se jodió y se colocó en el montón, una diferente del montón de objetos normales, creo, de la misma manera que CLR asigna y establece nuevos objetos en su aplicación.