Поделиться через


Ilasm.exe (ассемблер IL)

Ассемблер IL создает переносимый исполняемый (PE) файл из сборки на промежуточном языке (IL). (Дополнительные сведения о промежуточном языке см. в разделе Процесс управляемого выполнения.) Можно запустить полученный исполняемый файл, содержащий код на промежуточном языке и необходимые метаданные, чтобы проверить, выполняется ли код IL так, как ожидалось.

Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.

В командной строке введите следующее.

Синтаксис

ilasm [options] filename [[options]filename...]

Параметры

Аргумент Описание
filename Имя исходного файла с расширением IL. В этом файле содержатся директивы объявления метаданных и символические инструкции IL. Программа Ilasm.exe может создать один PE-файл из нескольких исходных файлов, для чего следует указать несколько аргументов исходных файлов. Примечание. Убедитесь, что последняя строка кода в исходном IL-файле имеет либо конечный пробел, либо символ конца строки.
Параметр Описание:
/32bitpreferred Создает предпочтительно 32-разрядный образ (PE32).
/Трассы:integer Параметр integer задает значение "FileAlignment" в необязательном заголовке NT. Если в файле указана IL-директива ALIGNMENT, этот параметр ее переопределяет.
/appcontainer Создает файл DLL или EXE, выполняющийся в контейнере приложения Windows, в качестве выходных данных.
/arm Задает Advanced RISC Machine (ARM) как целевой процессор.

Если разрядность образа не задана, в качестве значения по умолчанию используется /32bitpreferred.
/Базы: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 Выходным файлом будет исполняемый файл. Это значение по умолчанию.
/Флаги:integer Параметр integer задает значение "ImageFlags" в заголовке среды CLR. Если в файле указана IL-директива CORFLAGS, этот параметр ее переопределяет. Список допустимых значений параметра integerсм. в CorHdr.h, COMIMAGE_FLAGS.
/fold Свертывает идентичные тела методов в один.
/highentropyva На выходе создает исполняемый файл, который поддерживает технологию Address Space Layout Randomization (ASLR) с высокой энтропией. (Используется по умолчанию для /appcontainer.)
/Включают:includePath Задает путь для поиска файлов, включенных с помощью команды #include.
/itanium Задает Intel Itanium в качестве целевого процессора.

Если разрядность образа не задана, в качестве значения по умолчанию используется /pe64.
/Ключ:keyFile Компилирует файл filename со строгой подписью с помощью закрытого ключа в keyFile.
/key: @keySource Компилирует файл filename со строгой подписью с помощью закрытого ключа, созданного в keySource.
/listing Создает файл списка со стандартными выходными данными. Если этот параметр не задан, файл списка не создается.

Этот параметр не поддерживается в .NET Framework 2.0 и более поздних версиях.
/Mdv:versionString Задает строку версии метаданных.
/msv:major.minor Задает версию потока метаданных, где major и minor являются целыми числами.
/noautoinherit Отключает наследование по умолчанию из класса Object , если базовый класс не указан.
/nocorstub Запрещает создание заглушки CORExeMain.
/nologo Отключает отображение эмблемы Майкрософт при запуске.
/Выход:file.ext Задает имя и расширение выходного файла. По умолчанию имя выходного файла совпадает с именем первого исходного файла. Расширение по умолчанию — EXE. Если задан параметр /dll , по умолчанию используется расширение DLL. Примечание. Задание параметра /output:myfile.dll не равносильно указанию параметра /dll. Если параметр /dllне задан, будет создан исполняемый файл с именем myfile.dll.
/optimize Оптимизирует длинные инструкции в короткие. Например, br в br.s.
/pe64 Создает 64-разрядный образ (PE32+).

Если целевой процессор не задан, по умолчанию используется /itanium.
/pdb Создает PDB-файл, отслеживание отладочной информации не включается.
/quiet Задает тихий режим и отключает вывод сведений о ходе сборки.
/Ресурсов:file.res Включает указанный файл ресурсов в формате *.res в результирующий .exe или .dll файл. С параметром /resource может быть указан только один RES-файл.
/ssver:int.int Задает номер версии подсистемы в необязательном заголовке NT. Для /appcontainer и /arm минимальным номером версии является 6.02.
/Стека:stackSize Задает stackSizeв качестве значения "SizeOfStackReserve" в необязательном заголовке NT.
/stripreloc Указывает, что перемещения базового адреса не требуются.
/Подсистемы:integer Параметр integer задает значение "subsystem" в необязательном заголовке NT. Если в файле указана IL-директива SUBSYSTEM, этот параметр ее переопределяет. Список допустимых значений параметра integer см. в winnt.h, IMAGE_SUBSYSTEM.
/x64 Задает 64-разрядный процессор AMD в качестве целевого процессора.

Если разрядность образа не задана, в качестве значения по умолчанию используется /pe64.
/? Отображает синтаксис команд и параметров программы.

Примечание

Параметры программы Ilasm.exe не учитывают регистр и распознаются по первым трем буквам. Например, /lis равнозначно /listing , а /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

См. также