Создание исходного кода из сборок .NET во время отладки
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
При отладке приложения .NET может потребоваться просмотреть исходный код, который у вас нет. Например, происходит прерывание в исключении, или стек вызовов используется для перехода к исходному расположению.
- Создание исходного кода (декомпиляция) возможно только для приложений .NET и построено на проекте ILSpy с открытым кодом.
- Декомпиляция доступна только в Visual Studio 2019 версии 16.5 и более поздних версий.
- Атрибут SuppressIldasmAttribute, примененный к сборке или модулю, не позволит Visual Studio выполнить декомпиляцию. Хотя атрибут устарел в .NET 6 и более поздних версиях, Visual Studio учитывает атрибут.
Создание исходного кода
Если при выполнении отладки исходный код недоступен, в Visual Studio отображается документ Исходный код не найден, а если отсутствуют символы для сборки, отображается документ Символы не загружены. Оба документа имеют параметр Декомпилировать исходный код, который создает код C# для текущего расположения. Созданный код C# можно использовать так же, как любой другой исходный код. Вы можете просматривать этот код, проверять переменные, устанавливать точки останова и т. д.
Символы не загружены
На следующем рисунке показано сообщение Символы не загружены.

Исходный код не найден
На следующем рисунке показано сообщение Исходный код не найден.

Создание и внедрение исходного кода для сборки
Можно создать не только исходный код для определенного расположения, но и весь исходный код для конкретной сборки .NET. Чтобы выполнить эту задачу, перейдите в окно «Модули» и в контекстном меню сборки .NET, а затем выберите команду decompile Source to Symbol File . Visual Studio создает файл символов для сборки, а затем внедряет исходный код в файл символов. На последующем этапе можно извлечь внедренный исходный код.

Извлечение и просмотр внедренного исходного кода
Исходные файлы, внедренные в файл символов, можно извлечь с помощью команды Извлечь исходный код в контекстном меню окна Модули.

Извлеченные исходные файлы добавляются в решение как прочие файлы. В Visual Studio функция «Прочие файлы» по умолчанию отключена. Чтобы включить эту функцию, установите флажок Инструменты>Параметры>Среда>Документы>Показывать прочие файлы в Обозревателе решений. Если эта функция не включена, не удается открыть извлеченный исходный код.

Извлеченные исходные файлы отображаются в разделе прочих файлов в Обозревателе решений.

SourceLink
Для библиотек .NET или пакетов NuGet, включенных для SourceLink, можно также выполнять по шагам исходный код, задавать точки останова и использовать все функции отладчика. Дополнительные сведения см. в разделе «Включение отладки и диагностика с помощью исходного канала» и «Улучшение производительности во время отладки» с помощью SourceLink.
Известные ограничения
Требуется режим прерывания выполнения

Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме прерывания выполнения и приложение приостановлено. Например, Visual Studio переходит в режим прерывания, попадая в точку останова или в исключение. Вы можете легко активировать Visual Studio, чтобы разорвать следующий раз, когда код выполняется с помощью команды Break All ().
Ограничения декомпиляции
Создание исходного кода из промежуточного языка (IL), используемого в сборках .NET, имеет некоторые внутренние ограничения. Поэтому созданный исходный код не выглядит в точности как оригинальный исходный код. Большая часть различий сосредоточена в тех местах, где информация в оригинальном исходном коде не нужна во время выполнения. Например, во время выполнения не нужна такая информация, как пробелы, комментарии и имена локальных переменных. Рекомендуется использовать созданный исходный код, чтобы понять, как выполняется программа, а не в качестве замены оригинального исходного кода.
Отладка оптимизированных сборок или сборок выпуска
При отладке кода, декомпилированного из сборки, скомпилированной с помощью оптимизаций компилятора, могут возникнуть следующие проблемы:
- Точки останова могут не всегда привязаться к сопоставлению расположения источника данных.
- Пошаговое выполнение может не всегда выполняться в правильном расположении.
- Локальные переменные могут не иметь точных имен.
- Некоторые переменные могут быть недоступны для оценки.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Надежность декомпиляции
Относительно небольшой процент попыток декомпиляции может привести к сбою. Это поведение связано с ошибкой null-ссылочной точки последовательности в ILSpy. Мы устранили этот сбой путем перехвата таких проблем и корректного завершения попытки декомпиляции.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Ограничения при работе с асинхронным кодом
Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или завершаются сбоем. Шаблоны кода async/await и машины состояния yield state-machine в ILSpy реализованы только частично.
Дополнительные сведения можно найти в проблеме с GitHub: состояние генератора PDB.
Только мой код
Параметр Just My Code (JMC) позволяет Visual Studio перешагировать системные, платформы, библиотеки и другие вызовы, не являющиеся пользователями. Во время сеанса отладки в окне Модули отображаются модули кода, которые отладчик воспринимает как «Мой код» (т. е. пользовательский код).
Декомпиляция оптимизированных или выпускных модулей создает неиспользуемый код. Если отладчик прерывает работу в коде неиспользуемого неиспользуемого кода, например, откроется окно «Нет источника «. Чтобы отключить режим «Только мой код», перейдите в раздел Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие и снимите флажок Включить только мой код.
Извлеченный исходный код
Исходный код, извлеченный из сборки, имеет следующие ограничения.
- Имена и расположение созданных файлов нельзя настроить.
- Файлы являются временными и удаленными Visual Studio.
- Файлы помещаются в одну папку без использования какой-либо иерархии, которая была в оригинальных исходных файлах.
- Имя каждого файла содержит хэш контрольной суммы файла.
Создается только код C#
При декомпиляции создаются только файлы исходного кода на C#. Нет возможности создавать файлы на любом другом языке.
Как декомпилировать dll в Visual Studio
При использовании внешней библиотеки с закрытым исходным кодом иногда бывает полезно понять, как она работает, и отладить ее, как если бы она была частью вашего решения.
Чтобы отобразить исходный код библиотеки DLL при отладке, Visual Studio использует файлы PDB (файлы символов), чтобы связать скомпилированный код с исходным кодом. Это означает, что Visual Studio необходимо найти файл PDB и файлы .cs. Visual Studio может загружать эти файлы либо с локального диска, либо с сервера символов. Проблема со сборками с закрытым исходным кодом заключается в том, что у вас нет доступа к исходному коду. В этом случае Visual Studio не сможет получить код с вашего локального диска или удаленного сервера. Таким образом, вы не можете войти в код этой библиотеки DLL.
Начиная с Visual Studio 2019 16.5, вы можете создать PDB и исходные файлы, декомпилировав сборку. Visual Studio использует ILSpy для декомпиляции библиотек DLL. Декомпиляция кода имеет ограничения. Например, вы не можете получить ни исходные комментарии, ни имена переменных. Кроме того, некоторый код может быть сложнее читать, чем в исходном коде, потому что декомпилятор не распознает некоторые шаблоны. Кроме того, библиотеки DLL могут быть запутаны, что затрудняет их декомпиляцию.
Откройте окно модулей из меню Отладка → Windows → Модули

Найдите модуль для декомпиляции, щелкните его правой кнопкой мыши и выберите «Декомпилировать исходный код в файл символов»

Теперь вы сможете перейти к коду
Необязательно: покажите исходные файлы в обозревателе решений

Возможно, вам потребуется включить параметр «Показывать разные файлы в обозревателе решений» в настройках VS.

Примечание. Для отладки внешней библиотеки DLL необходимо отключить параметр «Только мой код» в настройках Visual Studio
Создать исходный код
Символы не загружены
На следующем рисунке показано сообщение «Нет загруженных символов».

Источник не найден
На следующем рисунке показано сообщение «Источник не найден».

Создать и внедрить исходники для сборки

Извлечь и просмотреть встроенный исходный код
Вы можете извлечь исходные файлы, встроенные в файл символов, с помощью команды «Извлечь исходный код» в контекстном меню окна «Модули».

Извлеченные исходные файлы добавляются в решение как разные файлы. Функция разных файлов по умолчанию отключена в Visual Studio. Вы можете включить эту функцию, установив флажок Инструменты > Параметры > Среда > Документы > Показать разные файлы в обозревателе решений. Без включения этой функции вы не сможете открыть извлеченный исходный код.

Извлеченные исходные файлы отображаются среди прочих файлов в обозревателе решений.

Создание исходного кода с помощью декомпиляции возможно только тогда, когда отладчик находится в режиме приостановки и приложение приостановлено. Например, Visual Studio переходит в режим останова при достижении точки останова или исключения. Вы можете легко инициировать останов Visual Studio при следующем запуске кода с помощью команды Break All ().
Ограничения декомпиляции
Отладка оптимизированных или выпуск сборок
При отладке кода, декомпилированного из сборки, скомпилированной с использованием оптимизации компилятора, вы можете столкнуться со следующими проблемами:
- Точки останова не всегда могут быть привязаны к соответствующему источнику.
- Переход не всегда может привести к правильному местоположению.
- Локальные переменные могут иметь неточные имена.
- Некоторые переменные могут быть недоступны для оценки.
Надежность декомпиляции
Относительно небольшой процент попыток декомпиляции может привести к сбою. Это связано с ошибкой нулевой ссылки точки следования в ILSpy. Мы устранили сбой, уловив эти проблемы и успешно отказавшись от попытки декомпиляции.
Ограничения для асинхронного кода
Результаты декомпиляции модулей с шаблонами асинхронного/ожидающего кода могут быть неполными или привести к полному сбою. Реализация ILSpy машин состояний async/await и yield реализована лишь частично.
Дополнительную информацию можно найти в выпуске GitHub: Статус генератора PDB.
Только мой код
Параметры Just My Code (JMC) позволяют Visual Studio обходиться без системных, фреймворковых, библиотечных и других непользовательских вызовов. Во время сеанса отладки в окне «Модули» показано, какие модули кода обрабатываются отладчиком как «Мой код» (пользовательский код).
В результате декомпиляции оптимизированных или выпущенных модулей создается непользовательский код. Например, если отладчик сломает ваш декомпилированный непользовательский код, появится окно No Source. Чтобы отключить функцию «Только мой код», выберите «Инструменты» > «Параметры» (или «Отладка» > «Параметры») > «Отладка» > «Общие», а затем снимите флажок «Включить только мой код».
Извлеченные источники
Исходный код, извлеченный из сборки, имеет следующие ограничения:
- Имя и расположение созданных файлов нельзя изменить.
- Эти файлы являются временными и будут удалены Visual Studio.
- Файлы помещаются в одну папку, и любая иерархия папок, которая была в исходных источниках, не используется.
- Имя файла для каждого файла содержит хэш контрольной суммы файла.
Итак, это совершенно не в моей стихии (и моего босса тоже).
Я скачал JustDecompile и понятия не имею, что мне делать.
У меня есть .dll, в котором я наконец-то вижу код, но мне нужна возможность редактировать код.
Например, в convertDataReaderToDataSet(SqlDataReader): DataSet. есть определения, которые мне нужно изменить, потому что они вызывают ошибки в математике. Например:
Вместо того, чтобы (now.Days

Защитите свои конечные точки от киберпреступников
2022-03-24 14:00:00 UTC Веб-семинар Веб-семинар: Cisco — защитите свои конечные точки от кибер-преступников Подробности о событии Просмотреть все события


Бобби Арчер написал:
Да, со всеми этими вещами, которые это влечет за собой, я понятия не имею, с чего начать, честно. Я думал, что смогу открыть его, изменить, сохранить. и я был бы хорош. Наверное, я ошибся?
Если бы это был скрипт, это было бы так, но с скомпилированным кодом вы должны сначала декомпилировать его (если это позволяет вам), а затем перекомпилировать его в новую .dll или .exe или что-то еще. В этом случае вам нужно будет создать новый проект после копирования кода из JustDecompile. Я думаю, что в VS это так же просто, как «Меню сборки»> «Создать решение», когда у вас есть проект и код.
15 ответов



Вам придется декомпилировать dll, скопировать исходный код в новый проект в Visual Studio и скомпилировать там новую dll.
Я предполагаю, что вы не можете получить доступ к исходному коду.

Вот в чем проблема. Я вижу это сейчас, просто нет доступа, чтобы изменить это. Итак, мне следует скопировать и вставить его в новый проект внутри Visual Web Developer?


Я всегда предполагал, что декомпиляция — это односторонний процесс. Но некоторые декомпиляторы могут позволить вам внести изменения и обратить процесс вспять. Совсем не уверен.
Вы можете попробовать использовать Visual Web Developer. Я никогда не использовал его и только что достиг предела своих советов.

Да, со всеми остальными вещами, которые это влечет за собой, я понятия не имею, с чего начать, если честно. Я думал, что смогу открыть его, изменить, сохранить. и я был бы хорош. Наверное, я ошибся?


Бобби Арчер написал:
Вот в чем проблема. Я вижу это сейчас, просто нет доступа, чтобы изменить это. Итак, я должен скопировать и вставить его в новый проект внутри Visual Web Developer? Я бы проверил выпуск сообщества Visual Studio. Это позволяет вам делать больше, чем просто веб-проекты.


Бобби Арчер написал:
Да, со всеми этими вещами, которые это влечет за собой, я понятия не имею, с чего начать, честно. Я думал, что смогу открыть его, изменить, сохранить. и я был бы хорош. Наверное, я ошибся?
Если бы это был скрипт, это было бы так, но с скомпилированным кодом вы должны сначала декомпилировать его (если это позволяет вам), а затем перекомпилировать его в новую .dll или .exe или что-то еще. В этом случае вам нужно будет создать новый проект после копирования кода из JustDecompile. Я думаю, что в VS это так же просто, как «Меню сборки»> «Создать решение», когда у вас есть проект и код.

Бобби Арчер написал:
Да, со всеми этими вещами, которые это влечет за собой, я понятия не имею, с чего начать, честно. Я думал, что смогу открыть его, изменить, сохранить. и я был бы хорош. Наверное, я ошибся?
Если бы это был скрипт, это было бы так, но с скомпилированным кодом вы должны сначала декомпилировать его (если это позволяет вам), а затем перекомпилировать его в новую .dll или .exe или что-то еще. В этом случае вам нужно будет создать новый проект после копирования кода из JustDecompile. Я думаю, что в VS это так же просто, как «Меню сборки»> «Создать решение», когда у вас есть проект и код. Спасибо. Надеюсь, если я просто пойду по этому пути, я не буду чувствовать себя таким подавленным 🙂

Итак, я смог декомпилировать и внести необходимые изменения. Кнопка сборки не активна. Итак, теперь я разобрался, как перекомпилировать без ошибок. лол


Удалось ли вам протестировать код с помощью кнопки запуска или клавиши F5? Все в стадии сборки отключено?
Ваша dll находится в папке проекта после тестирования?
C:\Users\\Documents\Visual Studio 2015\Projects\

Кнопки сборки не активны.
У меня две ошибки.

Ой, подождите, моя ошибка. Кнопки сборки не выделены серым цветом, но когда я приступаю к сборке, мне нужно исправить эти ошибки, прежде чем будет принято решение.

Святая корова! Я только что узнал, как добавить ссылку на проект. и теперь у меня нет ошибок.

Ага. Сейчас все взвинчено. :\
По крайней мере, я научился декомпилировать.
Эта тема заблокирована администратором и больше не открыта для комментариев.
Чтобы продолжить это обсуждение, задайте новый вопрос.
Эргономичное оборудование
Кто в США должен нести ответственность за предоставление эргономичного оборудования по запросу сотрудника? Это ИТ, поскольку ИТ предоставляет клавиатуры и мыши? Должен ли это быть HR, поскольку он эргономичен и несет потенциальную ответственность, если НЕ предоставляется? Должен ли это быть тот отдел.
Приветствие Xfinity (личный домашний Интернет)
Во-первых, мне больно. Я мог бы произнести речь «Он ставит передо мной задачу», как Хан в «Звездном пути 2: Гнев Хана». Просто замените «Они» на «Он». Но они сделали то, чего я хотел годами (десятилетиями?), так что, думаю, это должно быть признано. Ю.
Щелкни! SATCOM Threat, IE End of Life, Mac с кирпичами, Planet 9, Lego Delorean
Ваша ежедневная доза технических новостей. Вы должны это услышать. ФБР и CISA предупреждают об угрозах для сетей спутниковой связи Согласно новому предупреждению ФБР и CISA спутниковые сети находятся в зоне высокого риска. Согласно ZDNet.
Какими сверхспособностями вы хотели бы обладать?
Что может сделать ИТ-специалист со сверхспособностями? В каких ИТ-задачах вы бы их использовали и как?
Можно ли подключить интерфейс управления коммутатора к одному из его собственных портов коммутатора?
Недавно я понял, что у меня есть конфигурация коммутатора с непреднамеренным потенциальным побочным эффектом. У меня есть Aruba 6300F с несколькими виртуальными локальными сетями. Он работает в режиме уровня 3. Это работает следующим образом: я просто «включаю» функции маршрутизатора, а затем.

Теперь давайте перечислим инструменты.
- Исходный код открыт на github.
- Он был запущен в 2011 году и в настоящее время полностью разработан.
- В нем есть все функции, которые могут вам понадобиться при декомпиляции одной или нескольких сборок: поиск символа, открытие предварительно сохраненного списка сборок, навигация по гиперссылкам между символами, проводник метаданных сборки.
- Консольная версия ilspycmd может автоматизировать декомпиляцию.
- Он может создать PDB из сборки. Файл PDB, часто называемый файлом символов, представляет собой мост между IL-кодом сборки и исходным кодом соответствующего проекта. PDB в основном используется отладчиками для определения позиции в исходном коде, соответствующей выполняемой в данный момент инструкции IL. Это означает, что с генерацией ILSpy PDB можно отлаживать декомпилированный исходный код, как описано в этом ответе stackoverflow.
- Благодаря AvaloniaILSpy он без проблем работает на Mac и Linux. Это не относится к другим декомпиляторам, перечисленным ниже.
- Он интегрируется в Visual Studio и в VSCode (хотя, судя по комментариям, версия кода VS имеет проблемы).

- Декомпиляция всей сборки
- Декомпиляция двух версий сборки и сравнение результатов
- Создайте график зависимостей непосредственно из контекстного меню элемента ILSpy.
dotPeek — это бесплатный декомпилятор от Jetbrains. Он работает как автономный, а также естественным образом интегрируется в Resharper и, следовательно, в Visual Studio. Он имеет функции ILSpy, перечисленные выше, а также:


Как будто этого было недостаточно, dnSpy также является редактором сборки. Таким образом, dnSpy заменяет инструмент Reflexil, разработанный моим другом Себастьяном Лебретоном для редактирования IL.


IldAsm для ностальгии [бесплатный IL]

Печальная история, которая, по крайней мере, привела к появлению множества высококачественных бесплатных декомпиляторов, и это здорово.

NЗависит от декомпиляции

Начиная с версии 2022.1.0 NDepend предлагает подключаемый модуль ILSpy. Таким образом, инструменты взаимодействуют в обоих направлениях:
От NDepend до ILSpy. Просто щелкните правой кнопкой мыши любую сборку, пространство имен, класс, метод или поле в NDepend или Visual Studio (с установленным расширением NDepend). Есть 3 новых меню для:

Давайте уточним, что для сравнения двух наборов сборок — старых и новых битов — для использования меню Декомпилировать и сравнить просто щелкните ссылку Сравнить 2 версии базового кода в NDepend. Стартовая страница. Диалоговое окно позволит вам указать оба набора сборок для сравнения.


От ILSpy к NDepend можно:
- Показать любой элемент кода на графике или матрице зависимостей NDepend
- Анализ с помощью NDepend одной или нескольких выбранных сборок

Заключение
Разрешена ли декомпиляция?
Короткий ответ: да, если это явно не запрещено.Например, в лицензионном соглашении dotPeek говорится следующее: «Прежде чем использовать dotpeek для целей декомпиляции, вы должны убедиться, что декомпиляция двоичного кода не запрещена применимым лицензионным соглашением (за исключением случаев, когда вам может быть прямо разрешено закона) или что вы получили разрешение на декомпиляцию двоичного кода от владельца авторских прав».
Этот ответ stackoverflow предлагает более либеральный дискурс:
«Декомпиляция абсолютно ЗАКОННА, независимо от того, что говорят зазывалы. В лучшем случае вы можете быть привлечены к ответственности за несанкционированную деятельность, связанную с программным обеспечением, если только вы не распространяете его. Суды в США всегда защищали право пользователей точно знать, какой код устанавливается в их системах законно полученными программами.
Люди ДЕЙСТВИТЕЛЬНО должны перестать говорить «НЕЗАКОННО», если они не знают, что они говоришь о. В США абсолютно НЕТ закона, который гласит, что вы не можете копировать в личных целях или декомпилировать программное обеспечение. Компании пытались подать в суд, чтобы остановить это, но; а) это только гражданское, а не уголовное и, следовательно, НЕЗАКОННОЕ; и б) они выиграли только тогда, когда контент был передан сторонней стороне, от которой компании не получали оплаты. Т.е. было доказано, что человек нарушает закон».
Тем не менее, в комментарии к тому же вопросу говорится: «Это, однако, незаконно, если вы его расшифруете, возьмете весь исходный код, может быть, измените графику, упаковку и некоторые другие вещи и попытаетесь выдать это за ваше собственное приложение. Это незаконное распространение произведения, защищенного авторским правом».
Патрик Смаккиа
Мой отец был одним из первых программистов в 70-х, и мне посчастливилось переключиться с игр с Lego на программирование собственных микроигр, когда я был еще ребенком. С тех пор я не перестаю программировать.
За годы работы консультантом я накопил знания об архитектуре, эволюции и проблемах обслуживания больших и сложных реальных приложений. Казалось, спагетти и запутанное монолитное наследие касалось каждой достаточно крупной команды. Как следствие, я заинтересовался статическим анализом кода и начал проект NDepend.
Сегодня, имея более 12 000 компаний-клиентов, в том числе многие из компаний из списка Fortune 500, NDepend предлагает более глубокое понимание и полный контроль над своим приложением широкому кругу профессиональных пользователей по всему миру.
Я живу со своей женой и нашими детьми-близнецами Леной и Полом на прекрасном острове Маврикий в Индийском океане.
Читайте также:
- Как сделать сквозные строки в Excel
- Как удалить radmin vpn с компьютера
- Квадрат в копии символа Word
- Shift введите в слове что делает
- Как удалить шрифт с компьютера
How to properly decompile c# dlls for debugging with Visual Studio 2022 and .net 4.8
In Virual Studio 2022 I have a c# .net 4.8 project that references a dll for which I do not have the source code. I want to debug through the decompiled dll code. The dll has a corresponding .pdb file included in the same directory. Here my Debug settings:
With F12 I can view decompiled code. However, when I start debugging (F5) and try to step in (F11) into the dll, Visual Studio seams to debug a different version of the code. For example, Visual studio moves the debugging cursor through comments (screenshot below).
Is there anything that I am missing in my setup? Or is the .pdb outdated. How can I set up visual studio to decompile and properly debug through the dll?
asked Sep 5 at 16:42
anar chipur anar chipur
131 2 2 silver badges 11 11 bronze badges
This does indeed suggest a mismatch between the assembly and the pdb.
Sep 5 at 16:47
Yes, the PDB and DLL are definitely out of sync.
Sep 5 at 18:04
Decompiled code cannot provide comments. This might be a bug where it generated the comments from the Intellisense .xml file, if you see that file then remove it. Remove the .pdb file next. Tick «Require source files to exactly match» so you can tell that you’re looking at an outdated source file.
Sep 5 at 21:16
@anar Hi, you can take a look at my answer. 🙂
Sep 6 at 6:38
1 Answer 1
I can reproduce your situation:

Reasons for this situation: the decompiled code does not match the original code, or the pdb file does not match the source file version.
Because for C#, pdb records mainly information such as line numbers (if it is cpp, there will be source code information in pdb, which is different), and because the source file on your side is different from what it should be, it will «step into» a place that you «think» is completely wrong when you press f11, but actually it already go to the right place (I mean, it really should go to that line if you press f11 if the source file matches).
The key to your problem is to ensure the consistency of the three files: source file, dll and pdb.
You can use a tool like dotpeek to decompile the C# dll file into a project(you can use this tool to export dll to be a totally new project/solution), and then you can build this new project. In this case, you can ensure that the source files, dll and pdb in this new project are consistent . Have your test project refer to the dll in this decompiled project so you won’t run into problems.
It should be noted that the decompilation operation cannot guarantee that the decompilation code is 100% the same as the source code. It is inevitable that the code obtained in this way will be somewhat different from the source code.
By the way, as hans mentioned, there is a feature named ‘Require source files that exactly match the original version’:

This is the official document:
You need to turn on this feature(This is the default turn-on setting on my side.).
Отладка библиотек DLL в Visual Studio (C#, C++, Visual Basic, F#)
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Библиотека DLL (библиотека динамической компоновки) — это библиотека, содержащая код и данные, которые могут использоваться несколькими приложениями. Visual Studio можно использовать для создания, сборки, настройки и отладки библиотек DLL.
Создание библиотеки DLL
Создавать библиотеки DLL можно с помощью следующих шаблонов проектов Visual Studio.
- Библиотека классов C#, Visual Basic или F#
- Библиотека элементов управления Windows Forms (WCF) C# или Visual Basic
- Библиотека динамической компоновки (DLL) C++
Дополнительные сведения см. в разделе Методы отладки MFC.
Отладка библиотеки WCF аналогична отладке библиотеки классов. Дополнительные сведения см. в статье Элементы управления Windows Forms.
Обычно библиотека DLL вызывается из другого проекта. При отладке вызывающего проекта в зависимости от конфигурации библиотеки DLL можно выполнить шаг с заходом и отладить код библиотеки DLL.
Конфигурация отладки DLL
Когда вы используете шаблон проекта Visual Studio для создания приложения, Visual Studio автоматически создает требуемые параметры для конфигураций сборки отладки и выпуска. При необходимости эти параметры можно изменить. Дополнительные сведения см. в следующих статьях:
- Параметры проекта для конфигурации отладки C++
- Параметры проекта для конфигураций отладки .NET C#
- Параметры проекта для конфигураций отладки C#
- Параметры проекта для конфигурации отладки Visual Basic
- Практическое руководство. Настройка конфигураций отладки и выпуска
Установка DebuggableAttribute C++
Чтобы отладчик мог присоединиться к библиотеке DLL C++, код C++ должен добавлять DebuggableAttribute .
Установка DebuggableAttribute
- В обозревателе решений выберите проект DLL C++ и щелкните значок Свойства либо щелкните проект правой кнопкой мыши и выберите пункт Свойства.
- В области Свойства в разделе Компоновщик>Отладка выберите Да (/ASSEMBLYDEBUG) для свойства Отлаживаемая сборка.
Дополнительные сведения см. в статье /ASSEMBLYDEBUG.
Установка расположений DLL-файлов C/C++
Для отладки внешней библиотеки DLL вызывающий проект должен находить библиотеку DLL, ее PDB-файл и любые другие файлы, необходимые библиотеке DLL. Вы можете создать пользовательскую задачу сборки, чтобы скопировать эти файлы в выходную папку проекта \Debug, или скопировать файлы вручную.
Для проектов C/C++ можно задать расположения файлов заголовков и LIBD-файла на страницах свойств проекта, а не копировать их в выходную папку.
Задание расположений файла заголовка C/C и LIB-файла
- В обозревателе решений выберите проект DLL C/C++ и щелкните значок Свойства либо щелкните проект правой кнопкой мыши и выберите пункт Свойства.
- В верхней части области Свойства в разделе Конфигурация выберите Все конфигурации.
- В разделе C/C++>Общие>Дополнительные включаемые каталоги укажите папку с файлами заголовков.
- В разделе Компоновщик>Общие>Дополнительные каталоги библиотек укажите папку с LIB-файлами.
- В разделе Компоновщик>Ввод>Дополнительные зависимости укажите полный путь и имя файла для LIB-файлов.
- Нажмите ОК.
Дополнительные сведения о параметрах проекта C++ см. в статье Справочник C++ по страницам свойств проекта Windows.
Создание версии отладки
Перед началом отладки обязательно создайте отладочную версию библиотеки DLL. Для отладки библиотеки DLL вызывающее приложение должно находить PDB-файл и любые другие файлы, необходимые библиотеке DLL.
Вы можете создать пользовательскую задачу сборки, чтобы скопировать эти файлы DLL в выходную папку проекта \Debug, или скопировать файлы вручную.
Обязательно вызовите библиотеку DLL в правильном расположении. Это может показаться очевидным, но, если вызывающее приложение находит и загружает другую копию библиотеки DLL, отладчик никогда не достигнет заданных точек останова.
Отладка библиотеки DLL
Библиотеку DLL нельзя запускать напрямую. Ее должно вызывать приложение, обычно это EXE-файл. Дополнительные сведения см. в статье Проекты Visual Studio — C++.
Чтобы отладить библиотеку DLL, можно начать отладку из вызывающего приложения или выполнить отладку из проекта DLL, указав вызывающее приложение. Можно также использовать окно «Интерпретация» отладчика для вычисления функций или методов DLL во время разработки без использования вызывающего приложения.
Дополнительные сведения см. в статье Первое знакомство с отладчиком.
Запуск отладки из вызывающего приложения
Вызывать библиотеку DLL могут следующие виды приложений.
- Приложение из проекта Visual Studio в том же или другом решении из библиотеки DLL.
- Существующее приложение, которое уже развернуто и работает на тестовом или рабочем компьютере.
- Программа расположена в Интернете и доступна по URL–адресу.
- Веб-приложение с веб-страницей, которая внедряет библиотеку DLL.
Выполнить отладку библиотеки DLL из вызывающего приложения можно следующими способами.
- Откройте проект для вызывающего приложения и начните отладку, выбрав Отладка>Начать отладку или нажав клавишу F5. or
- Выполните присоединение к приложению, которое уже развернуто и работает на тестовом или рабочем компьютере. Используйте этот вариант для библиотек DLL на веб-сайтах или в веб-приложениях. Дополнительные сведения см. в разделе Практическое руководство. Присоединение к выполняемому процессу.
Перед запуском отладки этого вызывающего приложения нужно установить точку останова в DLL. См. статью Использование точек останова. При попадании в точку останова DLL можно пошагово проходить по коду, наблюдая действия в каждой строке. Дополнительные сведения см. в статье Навигация по коду с помощью отладчика.
Во время отладки в окне Модули можно проверить библиотеки DLL и EXE-файлы, загружаемые приложением. Чтобы открыть окно Модули, во время отладки выберите Отладка>Окна>Модули. Дополнительные сведения см. в разделе Практическое руководство. Использование окна модулей.
Использование окна «Интерпретация»
Окно Интерпретация можно использовать для вычисления функций или методов DLL во время разработки. Окно Интерпретация выполняет роль вызывающего приложения.
Окно Интерпретация можно использовать во время разработки с большинством типов проектов. Оно не поддерживается для SQL, веб-проектов или скриптов.
Например, чтобы протестировать метод с именем Test в классе Class1 , выполните следующие действия.
- Откройте проект DLL, откройте окно Интерпретация, последовательно выбрав пункты Отладка>Окна>Интерпретация или нажав сочетание клавиш CTRL+ALT+I.
- Создайте объект типа Class1 , введя следующий код C# в окне Интерпретация и нажав клавишу ВВОД. Этот управляемый код работает для C# и Visual Basic с соответствующими изменениями синтаксиса.
Class1 obj = new Class1();
?obj.Test(10);
Отладка в смешанном режиме
Вы можете написать вызывающее приложение для библиотеки DLL в управляемом или машинном коде. Если собственное приложение вызывает управляемую библиотеку DLL и вы хотите выполнить отладку этих двух объектов, можно включить управляемые и машинные отладчики в свойствах проекта. Точный способ выполнения этой операции зависит от того, откуда будет начата отладка: из проекта DLL или из проекта вызывающего приложения. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Можно выполнить отладку собственной библиотеки DLL из управляемого вызывающего проекта. Дополнительные сведения см. в статье об отладке управляемого и машинного кода.
См. также
- Отладка управляемого кода
- Подготовка к отладке проектов C++
- Типы проектов C#, F# и Visual Basic
- Параметры проекта для конфигурации отладки C++
- Параметры проекта для конфигураций отладки .NET C#
- Параметры проекта для конфигураций отладки C#
- Параметры проекта для конфигурации отладки Visual Basic
- Безопасность отладчика
