2008-12-09 12 views
10

De acuerdo con this article no es necesario rebasar para ensamblados .NET debido a la compilación JIT del código. El artículo indica:.NET assemblies y DLL rebasing

"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 errores de dirección base ya que MSIL las referencias están basadas en tokens, en lugar de basadas en direcciones. Por lo tanto, cuando se utiliza el compilador JIT, el sistema es resistente a las colisiones de direcciones base ".

Sin embargo, he notado que VS2008 asigna la dirección base por defecto 0x0400000 a todos los conjuntos (propiedades del proyecto> Crecimiento> avanzado) y si hago un listdlls /r para mi proceso de todos mis ensamblados .NET son, de hecho, rebasada por defecto.

Si asigno direcciones por mí mismo, no se realiza ninguna rebase.

Mi pregunta es: ¿Qué se basa en este caso y por qué?

EDITAR: Debería añadir que no estoy hablando de conjuntos NGen'ed.

Respuesta

3

CLR El mecanismo de carga utiliza LoadLibrary entre bastidores, 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. golpe de reparaciones, p. las direcciones absolutas & 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.

+0

Entiendo que no hay ninguna razón para las reparaciones, pero como estamos cargando ensamblajes desde una unidad de red, el rebase puede convertirse en un problema debido a la parte copia de paginación del rebase. Cualquier enlace con detalles sería apreciado. Gracias. –

+1

yo sepa, copia-a-archivo de paginación es el resultado directo de esas fixups, porque las páginas con código ejecutable se convierten grabable/privada para el proceso, por lo que el sistema operativo ya no pueden volver a cargarlos directamente desde el archivo DLL. ¿Quieres decir esto? – liggett78

+0

Existe un artículo antiguo (parece de mediana edad) pero valioso en http://msdn.microsoft.com/en-us/library/ms810432.aspx de hace 13 años sobre rebase (código nativo). – liggett78

0

¿Qué sistema operativo que se ejecuta? 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.

Cuestiones relacionadas