Сборки .NET и перезагрузка DLL

В соответствии с эта статья rebasing не требуется для сборников .NET из-за компиляции кода JIT. В статье говорится:

"JIT-скомпилированный код не имеет проблемы с перезагрузкой, поскольку адреса генерируются во время выполнения на основе того, где код помещается в память. Кроме того, MSIL редко затрагивается промахами базового адреса, поскольку ссылки MSIL основаны на токенах, а не на основе адресов. Таким образом, когда используется JIT-компилятор, система устойчива к базовым адресным коллизиям".

Тем не менее, я заметил, что VS2008 назначает базовый адрес по умолчанию 0x0400000 для всех сборок (свойства проектa > сборкa > расширенный), и если я выполняю listdlls /r для моего процесса, все мои сборки .NET фактически переустанавливаются по умолчанию.

Если я сам назначаю адреса, никаких перезагрузок не выполняется.

Мой вопрос: что в этом случае происходит и почему?

EDIT: Я должен добавить, что я не говорю о сборках NGen.

Ответ 1

Механизм загрузки CLR использует LoadLibrary за кулисами, так что это то, что вы наблюдаете: 2 сборки не могут быть загружены по тому же адресу. Теперь то, что люди часто имеют в виду, когда они пытаются переупаковать dll, - это избежать перф. попадание исправлений, например. абсолютные адреса и вызовы функций должны быть "перемещены" с загруженным базовым адресом. CLR не имеет этой проблемы (не уверен, что статические данные в приложении, что является второй частью этих исправлений, мне нужно будет прочитать об этом), потому что код MSIL загружается по требованию, когда вы вызываете функцию в управляемом коде. MSIL затем получает дрожание и помещается в кучу, другой из обычной кучи объектов, я считаю, таким же образом CLR выделяет и выдает новые объекты в вашем приложении.

Ответ 2

В какой ОС вы работаете? Я знаю, что в Vista и за ее пределами была введена ASLR, которая рандомизирует адресное пространство, в которое он загружает DLL. Это происходит для системных DLL, но не уверен в .net - возможно, что-то, что нужно изучить.