Сборки .NET и перебазирование DLL - PullRequest
11 голосов
/ 09 декабря 2008

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

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

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

Если я сам присваиваю адреса, перебазировка не производится.

Мой вопрос: что перебазируется в этом случае и почему?

РЕДАКТИРОВАТЬ: я должен добавить, что я не говорю о сборках NGen.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2008

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

1 голос
/ 09 декабря 2008

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

...