Как использовать ICSharpCode.Decompiler для декомпиляции всей сборки в текстовый файл? - PullRequest
0 голосов
/ 04 июля 2019

Мне нужно получить либо весь код IL, либо декомпилированный исходный код в текстовый файл. Возможно ли это с помощью компилятора ICSharpCode.Decompiler модуля ILSpy?

1 Ответ

0 голосов
/ 25 июля 2019

С помощью ILSpy вы можете выбрать узел сборки в древовидном представлении, а затем использовать Файл> Сохранить код, чтобы сохранить результат на диск.Для этого ILSpy будет использовать текущий выбранный язык, поэтому он может как дизассемблировать, так и декомпилировать.При декомпиляции в C # диалоговое окно сохранения будет иметь опции для сохранения проекта C # (.csproj) с отдельными файлами исходного кода для класса;или один файл C # (.cs) для всей сборки.


Для программной декомпиляции используйте библиотеку ICSharpCode.Decompiler (доступна в NuGet).Например, декомпилировать всю сборку в строку:

var decompiler = new CSharpDecompiler(assemblyFileName, new DecompilerSettings());
string code = decompiler.DecompileWholeModuleAsString();

См. Проект ICSharpCode.Decompiler.Console для более расширенного использования API декомпилятора.Часть с resolver.AddSearchDirectory(path); в этом консольном проекте может быть релевантной, потому что декомпилятору нужно найти ссылочные сборки.


Библиотека ICSharpCode.Decompiler также имеет API дизассемблера (немного ниже).уровень):

string code;
using (var peFileStream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read))
using (var peFile = new PEFile(sourceFileName, peFileStream))
using (var writer = new StringWriter()) {
    var output = new PlainTextOutput(writer);
    ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
    rd.DetectControlStructure = false;
    rd.WriteAssemblyReferences(peFile.Metadata);
    if (metadata.IsAssembly)
        rd.WriteAssemblyHeader(peFile);
    output.WriteLine();
    rd.WriteModuleHeader(peFile);
    output.WriteLine();
    rd.WriteModuleContents(peFile);

    code = writer.ToString();
}
...