В главе 1 было показано, как применять утилиту ildasm.exe
ilasm.exe).Выражаясь формально, такой прием называется
• Вам необходимо модифицировать сборку, исходный код которой больше не доступен.
• Вы работаете с далеким от идеала компилятором языка .NET Core, который генерирует неэффективный (или явно некорректный) код CIL, поэтому нужно изменять кодовую базу.
• Вы конструируете библиотеку взаимодействия с СОМ и хотите учесть ряд атрибутов COM IDL, которые были утрачены во время процесса преобразования (такие как COM-атрибут [helpstring]
Чтобы ознакомиться с процессом возвратного проектирования, создайте новый проект консольного приложения .NET Core на языке C# по имени RoundTrip
dotnet new console -lang c# -n RoundTrip -o .\RoundTrip -f net5.0
Модифицируйте операторы верхнего уровня, как показано ниже:
// Простое консольное приложение С#.
Console.WriteLine("Hello CIL code!");
Console.ReadLine();
Скомпилируйте программу с применением интерфейса CLI:
dotnet build
На заметку!
Вспомните из главы 1, что результатом компиляции всех сборок .NET Core (библиотек классов и консольных приложений) будут файлы с расширением*.dll, которые выполняются с применением интерфейса .NET Core CLI. Нововведением .NET Core 3+ (и последующих версий) является то, что файл dotnet.exe копируется в выходной каталог и переименовывается согласно имени сборки. Таким образом, хотя выглядит так, что ваш проект был скомпилирован в RoundTrip.exe, на самом деле он компилируется в RoundTrip.dll, а файл dotnet.exe копируется в RoundTrip.exe вместе с обязательными аргументами командной строки, необходимыми для запуска Roundtrip.dll.Запустите ildasm.exe
RoundTrip.dll, используя следующую команду (на уровне каталога решения):ildasm /all /METADATA /out=.\RoundTrip\RoundTrip.il
.\RoundTrip\bin\Debug\net5.0\RoundTrip.dll
На заметку!
При сбрасывании содержимого сборки в файл утилитаildasm.exe также генерирует файл *.res. Такие ресурсные файлы можно игнорировать (и удалять), поскольку в текущей главе они не применяются. В них содержится низкоуровневая информация, касающаяся безопасности CLR (помимо прочих данных).Теперь можете просмотреть файл RoundTrip.il
// Ссылаемые сборки.
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A)
.ver 5:0:0:0
}
.assembly extern System.Console
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 5:0:0:0
}
// Наша сборка.
.assembly RoundTrip
{
...
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module RoundTrip.dll
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003
.corflags 0x00000001
// Определение класса Program.
.class private abstract auto ansi beforefieldinit '
extends [System.Runtime]System.Object
{
.custom instance void [System.Runtime]System.Runtime.CompilerServices
.
CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .method private hidebysig static void '
{
// Помечает этот метод как точку входа исполняемой сборки.
.entrypoint
.maxstack 8
IL_0000: ldstr "Hello CIL code!"
IL_0005: call void [System.Console]System.Console::WriteLine(string)