Ассемблер MSIL (Ilasm.exe)

Обновлен: Ноябрь 2007

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

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

Параметры

Аргумент

Описание

имя файла

Имя исходного файла с расширением IL. В этом файле содержатся директивы объявления метаданных и символические инструкции MSIL. Ilasm.exe может создать один PE-файл из нескольких исходных файлов, для чего следует указать несколько аргументов исходных файлов.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.
Убедитесь, что последняя строка кода в исходном файле с расширением IL имеет либо конечный пробел, либо символ конца строки.

Параметр

Описание

/alignment=integer

Аргумент integer задает значение поля FileAlignment в дополнительном заголовке NT. Если в файле указана IL-директива .alignment, этот параметр переопределяет ее.

/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 и использует неявные точки последовательности.

Параметры IMPL и OPT — новые в.NET Framework версии 2.0.

/dll

Выходным файлом будет библиотека DLL.

/enc=file

Создает разности "Изменить и продолжить" из указанного файла источника.

Данный аргумент предназначен только для использования в учебных заведениях и не поддерживается для коммерческого использования.

Новые возможности .NET Framework версии 2.0

/exe

Выходным файлом будет исполняемый файл. Это режим работы по умолчанию.

/flags=integer

Аргумент integer задает значение поля ImageFlags в заголовке общеязыковой среды выполнения. Если в файле указана IL-директива .corflags, этот параметр переопределяет ее. Список допустимых значений аргумента integer см. в CorHdr.h, COMIMAGE_FLAGS.

/fold

Свертывает идентичные тела методов в один.

Новые возможности .NET Framework версии 2.0

/include=includePath

Задает путь для поиска файлов, включенных с помощью команды #include.

Новые возможности .NET Framework версии 2.0

/itanium

Задает Intel Itanium в качестве целевого процессора.

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

Новые возможности .NET Framework версии 2.0

/key:файл_ключа

Компилирует файл имя_файла со строгой подписью закрытым ключом из указанного файла_ключей.

/key:@источник_ключа

Компилирует файл имя_файла со строгой подписью закрытым ключом из указанного источника_ключа.

/listing

Создает файл списка со стандартным выводом программы. Если этот параметр не задан, файл списка не создается.

Этот параметр не поддерживается в версии .NET Framework 2.0 и более поздних.

/mdv=versionString

Задает строку версии метаданных.

Новые возможности .NET Framework версии 2.0

/msv=major.minor

Задает версию потока метаданных, где major и minor являются целыми числами.

Новые возможности .NET Framework версии 2.0

/noautoinherit

Отключает наследование по умолчанию от класса Object, если базовый класс не указан.

Новые возможности .NET Framework версии 2.0

/nocorstub

Запрещает создание заглушки CORExeMain.

Новые возможности .NET Framework версии 2.0

/nologo

Отключает отображение эмблемы Майкрософт при запуске.

/output:file.ext

Задает имя и расширение выходного файла. По умолчанию имя выходного файла совпадает с именем первого исходного файла. Расширение по умолчанию — .exe. Если задан параметр /dll, по умолчанию используется расширение .dll.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.
Задание параметра /output:myfile.dll не равносильно указанию параметра /dll . Если параметр /dll не задан, будет создан исполняемый файл с именем myfile.dll.

/optimize

Оптимизирует длинные инструкции в короткие. Например, br в br.s.

Новые возможности .NET Framework версии 2.0

/pe64

Создает 64-разрядное изображение (PE32+).

Если целевой процессор не задан, по умолчанию используется (/itanium).

Новые возможности .NET Framework версии 2.0

/pdb

Создает файл PDB без включения отслеживания отладочной информации.

Новые возможности .NET Framework версии 2.0

/quiet

Отключает вывод сведений о ходе сборки.

/resource:file.res

Включает указанный файл ресурсов формате *.res в выходной файл .exe или .dll. С параметром /resource может быть указан только один RES-файл.

/stack=stackSize

Устанавливает stackSize в качестве значения SizeOfStackReserve в дополнительном заголовке NT.

Новые возможности .NET Framework версии 2.0

/stripreloc

Указывает, что не требуются перемещения базы.

Новые возможности .NET Framework версии 2.0

/subsystem=integer

Аргумент integer задает значение поля subsystem в дополнительном заголовке NT. Если в файле указана IL-директива .subsystem, этот параметр переопределяет ее. Список допустимых значений аргумента integer см. winnt.h, IMAGE_SUBSYSTEM.

/x64

Задает 64-разрядный процессор AMD в качестве целевого процессора.

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

Новые возможности .NET Framework версии 2.0

/?

Отображает синтаксис команды и параметры программы.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.

Все параметры программы Ilasm.exe нечувствительны к регистру и могут быть сокращены до первых трех букв. Например, /lis эквивалентно /listing, а /res:myresfile.res эквивалентно /resource:myresfile.res. Разделителем параметра и его аргумента может служить двоеточие (:) или знак равенства (=). Например, команда /output:file.ext эквивалентна команде /output=file.ext.

Заметки

Ассемблер MSIL весьма полезен разработчикам ПО для создания и внедрения генераторов MSIL. При разработке инструментальных средств и компиляторов это средство позволяет сосредоточить усилия на написании MSIL-кода и генерации метаданных, а не на преобразовании MSIL-кода в формат PE-файла.

Аналогично таким компиляторам для среды выполнения, как C# и Visual Basic, программа Ilasm.exe не создает промежуточных объектных файлов и позволяет пропустить этап компоновки при генерации PE-файла.

Ассемблер MSIL может выразить все существующие метаданные и возможности MSIL языков программирования, предназначенные для взаимодействия со средой выполнения. Это позволяет адекватно выразить на ассемблере MSIL и скомпилировать с помощью программы Ilasm.exe управляемый код, написанный на любом из этих языков.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.

Компиляция может не удаться, если последняя строка кода в исходном файле с расширением IL не имеет либо конечного пробела, либо символа конца строки.

Ilasm.exe может применяться совместно с парным к нему инструментом, Ildasm.exe. Ildasm.exe принимает на вход PE-файл, содержащий код MSIL, и создает текстовый файл, который можно передать на вход Ilasm.exe. Это полезно, к примеру, при компиляции кода на языке программирования, не поддерживающем все атрибуты метаданных среды выполнения. После компиляции кода и обработки результатов с помощью Ildasm.exe можно вручную добавить недостающие атрибуты в выходной текстовый файл MSIL. Чтобы создать окончательный исполняемый файл, обработайте этот текстовый файл программой Ilasm.exe.

Эта технология может быть применена для создания одного PE-файла из нескольких PE-файлов, созданных различными компиляторами.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.

На данный момент эта технология не может быть применена к PE-файлам, содержащим встроенный машинный код (например, к PE-файлам, созданным компилятором Microsoft Visual C++).

Для того, чтобы совместное применение Ildasm.exe и Ilasm.exe порождало как можно меньше ошибок, ассемблер не выполняет некоторые простые действия по оптимизации, а именно не определяет, какую форму инструкций применить — короткую или полную. Например, инструмент не пытается определить возможность замены полной кодировки, указанной в исходном MSIL-коде или созданной другим компилятором, короткой формой. Чтобы использовать короткую кодировку, требуется явно выписать ее. Однако ассемблер проверяет условия выхода за границу там, где это возможно.

496e4ekx.alert_note(ru-ru,VS.90).gifПримечание.

Программа Ildasm.exe работает только с файлами, расположенными на жестком диске. Программа не обрабатывает файлы, установленные в глобальный кэш сборок.

Дополнительные сведения о грамматике MSIL см. в файле asmparse.grammar в разделе SDK (пакет средств разработки программного обеспечения) для Windows.

Примеры

Следующая команда выполняет сборку файла MSIL myTestFile.il и создает выполняемый файл myTestFile.exe.

ilasm myTestFile

Следующая команда выполняет сборку файла MSIL myTestFile.il и создает DLL-файл myTestFile.dll.

ilasm myTestFile /dll 

Следующая команда выполняет сборку файла MSIL myTestFile.il и создает DLL-файл myNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

В приведенном ниже примере кода показано очень простое приложение, выводящее сообщение "Hello World!" на консоль. Можно скомпилировать данный код и использовать программу Ildasm.exe для создания файла MSIL.

using System;
public class Hello
{
    public static void Main(String[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

Следующий пример кода MSIL соответствует предыдущему примеру кода C#. Можно скомпилировать данный код в сборку с помощью программы Ассемблер MSIL (Ilasm.exe). Оба примера кода (MSIL и 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

См. также

Основные понятия

Компиляция в MSIL

Ссылки

Инструменты .NET Framework

Дизассемблер MSIL (Ildasm.exe)

Командная строка пакета SDK