Я не уверен, ищете ли вы (1) виртуальный адрес сопоставленного файла сборки или (2) виртуальный адрес, на котором код JITed помещается после загрузки сборки.
Далее я рассмотрю простой случай, когда хост-процесс загружает несколько сборок. Код можно найти здесь . Давайте сосредоточимся на том, что происходит, когда загружается x64_Assembly.dll .
Если мы ищем (1) определенный выше (виртуальный адрес сопоставленного файла в адресном пространстве процесса), то это означает выделенную ниже строку, показанную в выходных данных VMMap. Это где ОС загружает файл, содержащий сборку. Я не знаю, как вы могли бы получить это программно из своего собственного приложения.
Для (2), это виртуальный адрес, где находится JIT-код сборки, вы можете увидеть соответствующий адрес, если вы войдите в свой код с помощью отладчика:
Когда указывает этот поток , сборка JITed помещается в куча, которую вы можете легко проверить с помощью VMMap снова. В моем случае адрес, показанный в отладчике, можно увидеть в блоке кучи с VMMap:
Так какой адрес вы на самом деле нацеливание?
Позднее обновление : Вы можете использовать CLR MD для получения очень интересных данных. Взгляните на простой код, приведенный ниже (взят из «Написание высокопроизводительного кода .NET» Бена Уотсона), который получает (1) и , возможно, (2). Вы можете видеть, что адрес образа загруженной сборки в VMMap совпадает со значением module.ImageBase
, поэтому вы обязательно получите (1). Для (2), однако, значение module.Address
НЕ совпадает с переменной m_assembly
, замеченной в отладчике в моем исходном ответе - поэтому один из них показывает что-то еще. Однако, если вы подумаете об этом, не весь код JITed одновременно - вместо этого CLR будет JIT компилировать методы так, как (и если) они вызываются. Поэтому я считаю, что виртуальные адреса, содержащиеся в 2 переменных, указывают на некоторую общую структуру, представляющую сборку.
Поскольку вы упомянули, что у вас есть доступ для проверки содержимого памяти, вы можете довольно быстро выяснить, какая из двух переменных представляет интерес ( 2). [+1135] 1136 Как вы могли это сделать на практике? Я имею в виду создание проекта CLR MD, который просто выводит информацию, которую вы ищете ((1) и (2), в простой файл)), а затем запускает этот EXE-файл вашим основным кодом, чтобы он анализировал ваш процесс и сборка он загружает и записывает данные. Когда процесс CLR MD завершается, ваш реальный код может получить информацию, записанную в файле, и работать с теми виртуальными адресами, которые он получил. В моем примере выше PID был просто жестко закодирован (я использовал Process Explorer, чтобы увидеть назначенный PID), но вы, вероятно, могли бы передать его в качестве аргумента в свой проект CLR MD.
Вы можете использовать опцию Управление пакетами NuGet для решения в Visual Studio, чтобы установить CLR MD и настроить его для своего конкретного проекта, а затем просто добавить using Microsoft.Diagnostics.Runtime
.
2 вещи, которые нужно иметь в виду:
AttachFlag.Passive
в метод AttachToProcess
, иначе ваш исходный код будет приостановлен на неопределенный срок. Я также проверил эту опцию после того, как сделал снимок экрана выше и успешно получил значения module.ImageBase
и module.Address
, плюс исходный код продолжал работать просто отлично. От личного опыта мерзавец-svn всегда генерирует те же самые фиксации при клонировании, или выбирая от репозитория SVN с теми же параметрами (попробуйте его: создайте фиктивный репозиторий, клонируйте его с мерзавцем-svn, сделайте еще некоторые фиксации, клонируйте его снова и выберите на первой копии; получающиеся фиксации должны иметь тот же самый хеш).
Это дает Вам интересную опцию: можно запустить отдельное новое зеркало с тех же параметров и сравнить обоих для наблюдения, куда они отличаются (или оно они отличаются вообще; обязательно сравните хеши, так как они что вопросы). Если они - то же (или Вы решаете фиксации после того, как они отличаются, не имеют значения), можно использовать новое зеркало, не повреждая ветвления (или повреждая меньше из них, если Вы решили проигнорировать несколько отличающихся фиксаций).