Ilasm.exe (ассемблер IL)
Ассемблер IL создает переносимый исполняемый (PE) файл из сборки на промежуточном языке (IL). (Дополнительные сведения о IL см. в разделе Процесс управляемого выполнения.) Вы можете запустить результирующий исполняемый файл, содержащий IL и необходимые метаданные, чтобы определить, выполняется ли IL должным образом.
Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.
Введите в командной строке: .
Синтаксис
ilasm [options] filename [[options]filename...]
Параметры
Аргумент | Description |
---|---|
filename |
Имя исходного файла с расширением IL. В этом файле содержатся директивы объявления метаданных и символические инструкции IL. Программа Ilasm.exe может создать один PE-файл из нескольких исходных файлов, для чего следует указать несколько аргументов исходных файлов. Примечание. Убедитесь, что последняя строка кода в исходном IL-файле имеет либо конечный пробел, либо символ конца строки. |
Вариант | Описание |
---|---|
/32bitpreferred | Создает предпочтительно 32-разрядный образ (PE32). |
/alignment: integer |
Параметр integer задает значение "FileAlignment" в необязательном заголовке NT. Если в файле указана IL-директива ALIGNMENT, этот параметр ее переопределяет. |
/appcontainer | Создает файл DLL или EXE, выполняющийся в контейнере приложения Windows, в качестве выходных данных. |
/arm | Задает Advanced RISC Machine (ARM) как целевой процессор. Если разрядность образа не задана, в качестве значения по умолчанию используется /32bitpreferred. |
/base: integer |
Параметр integer задает значение "ImageBase" в необязательном заголовке NT. Если в файле указана IL-директива IMAGEBASE, этот параметр ее переопределяет. |
/clock | Измеряет и выводит следующие значения времени компиляции указанного исходного IL-файла в миллисекундах. Total Run: общее время, затраченное на перечисленные ниже операции. Startup: загрузка и открытие файла. Emitting MD: выдача метаданных. Ref to Def Resolution: разрешение ссылок на определения в файле. CEE File Generation: создание образа файла в памяти. PE File Writing: запись образа в PE-файл. |
/debug[:IMPL|OPT] | Включает отладочные сведения (имена локальных переменных и аргументов, номера строк). Создает PDB-файл. /debug без дополнительных значений отключает JIT-оптимизацию и использует точки последовательности из PDB-файла. IMPL отключает JIT-оптимизацию и использует неявные точки последовательности. OPT включает JIT-оптимизацию и использует неявные точки последовательности. |
/dll | Выходным файлом будет библиотека DLL. |
/enc: file |
Создает разности "Изменить и продолжить" из указанного файла источника. Данный аргумент предназначен только для использования в учебных заведениях и не поддерживается для коммерческого использования. |
/exe | Выходным файлом будет исполняемый файл. Это значение по умолчанию. |
/flags: integer |
Параметр integer задает значение "ImageFlags" в заголовке среды CLR. Если в файле указана IL-директива CORFLAGS, этот параметр ее переопределяет. Список допустимых значений параметра integerсм. в CorHdr.h, COMIMAGE_FLAGS. |
/fold | Свертывает идентичные тела методов в один. |
/highentropyva | На выходе создает исполняемый файл, который поддерживает технологию Address Space Layout Randomization (ASLR) с высокой энтропией. (Используется по умолчанию для /appcontainer.) |
/include: includePath |
Задает путь для поиска файлов, включенных с помощью команды #include . |
/itanium | Задает Intel Itanium в качестве целевого процессора. Если разрядность образа не задана, в качестве значения по умолчанию используется /pe64. |
/key: keyFile |
Компилирует файл filename со строгой подписью с помощью закрытого ключа в keyFile . |
/key: @keySource |
Компилирует файл filename со строгой подписью с помощью закрытого ключа, созданного в keySource . |
/listing | Создает файл списка со стандартными выходными данными. Если этот параметр не задан, файл списка не создается. Этот параметр не поддерживается в .NET Framework 2.0 и более поздних версиях. |
/mdv: versionString |
Задает строку версии метаданных. |
/msv: major .minor |
Задает версию потока метаданных, где major и minor являются целыми числами. |
/noautoinherit | Отключает наследование по умолчанию из класса Object , если базовый класс не указан. |
/nocorstub | Запрещает создание заглушки CORExeMain. |
/nologo | Отключает отображение эмблемы Майкрософт при запуске. |
/output: file.ext |
Задает имя и расширение выходного файла. По умолчанию имя выходного файла совпадает с именем первого исходного файла. Расширение по умолчанию — EXE. Если задан параметр /dll , по умолчанию используется расширение DLL. Примечание. Задание параметра /output:myfile.dll не равносильно указанию параметра /dll. Если параметр /dllне задан, будет создан исполняемый файл с именем myfile.dll. |
/optimize | Оптимизирует длинные инструкции в короткие. Например, br в br.s . |
/pe64 | Создает 64-разрядный образ (PE32+). Если целевой процессор не задан, по умолчанию используется /itanium . |
/pdb | Создает PDB-файл, отслеживание отладочной информации не включается. |
/quiet | Задает тихий режим и отключает вывод сведений о ходе сборки. |
/resource: file.res |
Включает указанный файл ресурсов в формате *.res в результирующем .exe или .dll файле. С параметром /resource может быть указан только один RES-файл. |
/ssver: int .int |
Задает номер версии подсистемы в необязательном заголовке NT. Для /appcontainer и /arm минимальным номером версии является 6.02. |
/stack: stackSize |
Задает stackSize в качестве значения "SizeOfStackReserve" в необязательном заголовке NT. |
/stripreloc | Указывает, что перемещения базового адреса не требуются. |
/subsystem: integer |
Параметр integer задает значение "subsystem" в необязательном заголовке NT. Если в файле указана IL-директива SUBSYSTEM, этот параметр ее переопределяет. Список допустимых значений параметра integer см. в winnt.h, IMAGE_SUBSYSTEM. |
/x64 | Задает 64-разрядный процессор AMD в качестве целевого процессора. Если разрядность образа не задана, в качестве значения по умолчанию используется /pe64. |
/? | Отображает синтаксис команд и параметров программы. |
Примечание.
Параметры программы Ilasm.exe не учитывают регистр и распознаются по первым трем буквам. Например, /lis эквивалентен /листингу и /res:myresfile.res эквивалентно /resource:myresfile.res. Параметры, указывающие аргументы, принимают двоеточие (:) или знак равенства (=) в качестве разделителя между параметром и аргументом. Например, /output:file.ext эквивалентно /output=file.ext.
Замечания
Ассемблер IL весьма полезен разработчикам ПО для создания и внедрения генераторов IL. Используя программу Ilasm.exe, компилятор и другие средства, разработчики могут сосредоточить свои усилия на работе с IL и создании метаданных, а не на преобразовании IL в формат PE-файла.
Аналогично таким компиляторам для среды выполнения, как C# и Visual Basic, программа Ilasm.exe не создает промежуточные объектные файлы и при создании PE-файла позволяет пропустить этап связывания.
Ассемблер IL может выразить все существующие метаданные и возможности IL языков программирования, предназначенные для взаимодействия со средой выполнения. С его помощью можно адекватно выразить на ассемблере IL и скомпилировать с помощью программы Ilasm.exe управляемый код, написанный на любом из этих языков.
Примечание.
Компиляция может завершиться ошибкой, если последняя строка кода в исходном IL-файле не имеет конечного пробела или символа конца строки.
Программа Ilasm.exe может применяться совместно с сопутствующей программой — Ildasm.exe. Программа Ildasm.exe анализирует PE-файл, содержащий IL-код, и создает текстовый файл, подходящий для обработки программой Ildasm.exe. Это полезно, к примеру, при компиляции кода на языке программирования, не поддерживающем все атрибуты метаданных среды выполнения. После компиляции кода и обработки результатов с помощью программы Ildasm.exe можно вручную добавить недостающие атрибуты в полученный текстовый IL-файл. Чтобы создать итоговый исполняемый файл, этот текстовый файл следует обработать с помощью программы Ilasm.exe.
Эту технологию можно также использовать для создания одного PE-файла из нескольких PE-файлов, созданных различными компиляторами.
Примечание.
На данный момент такая технология не применяется к PE-файлам, содержащим встроенный машинный код (например, к PE-файлам, созданным компилятором Microsoft Visual C++).
Чтобы обеспечить наибольшую точность совместной работы программ Ildasm.exe и Ilasm.exe, по умолчанию ассемблер не заменяет короткие коды на длинные, которые могут быть в источниках IL (или созданы другим компилятором). С помощью параметра /optimize можно заменить короткие коды там, где это возможно.
Примечание.
Программа Ildasm.exe работает только с файлами, расположенными на жестком диске. Программа не обрабатывает файлы, установленные в глобальном кэше сборок.
Дополнительные сведения о грамматике IL см. в файле asmparse.grammar в составе Windows SDK.
Сведения о версии
Начиная с платформа .NET Framework 4.5, можно подключить пользовательский атрибут к реализации интерфейса с помощью кода, аналогичного следующему:
.class interface public abstract auto ansi IMyInterface
{
.method public hidebysig newslot abstract virtual
instance int32 method1() cil managed
{
} // end of method IMyInterface::method1
} // end of class IMyInterface
.class public auto ansi beforefieldinit MyClass
extends [mscorlib]System.Object
implements IMyInterface
{
.interfaceimpl type IMyInterface
.custom instance void
[mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
…
Начиная с платформа .NET Framework 4.5, можно указать произвольный маршал BLOB (двоичный большой объект) с помощью необработанного двоичного представления, как показано в следующем коде:
.method public hidebysig abstract virtual
instance void
marshal({ 38 01 02 FF })
Test(object A_1) cil managed
Дополнительные сведения о грамматике IL см. в файле asmparse.grammar в составе Windows SDK.
Примеры
Следующая команда выполняет сборку IL-файла myTestFile.il и создает исполняемый файл myTestFile.exe.
ilasm myTestFile
Следующая команда выполняет сборку IL-файла myTestFile.il и создает DLL-файл myTestFile.dll.
ilasm myTestFile /dll
Следующая команда выполняет сборку IL-файла myTestFile.il и создает DLL-файл myNewTestFile.dll.
ilasm myTestFile /dll /output:myNewTestFile.dll
В следующем примере кода показано чрезвычайно простое приложение, отображающее "Hello World!" в консоли. Можно скомпилировать этот код и создать IL-файл с помощью программы Ildasm.exe.
using System;
public class Hello
{
public static void Main(String[] args)
{
Console.WriteLine("Hello World!");
}
}
Следующий пример кода IL соответствует предыдущему примеру кода на C#. Можно скомпилировать этот код в сборку с помощью ассемблера IL. Примеры кода IL и C# отображают "Hello World!" в консоли.
// Metadata version: v2.0.50215
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly sample
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module sample.exe
// MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02F20000
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Hello
extends [mscorlib]System.Object
{
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World!"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Hello::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Hello::.ctor
} // end of class Hello