Как я уже упоминал в своем предыдущем посте, я буду иметь дело с IL в серии статей. В этом я хотел бы работать над типами данных и объявлением переменных в IL. Я прекрасно понимаю, что решить эту проблему несложно, но важно знать, какие типы данных лежат в основе IL.

Честно говоря, большой разницы между именованием в типах данных C# и IL нет. Вторая часть этого поста будет посвящена объявлению переменных. Это большая часть любого языка, поэтому для меня это хорошая отправная точка. Здесь я напишу про объявление переменной. В частности, здесь мы столкнемся с небольшой разницей между C# и IL.

Итак, давайте сначала начнем с типов данных и их противоположных частей в C#.

Bool или не Boolean

В этой главе я рассмотрю типы данных, существующие в ILAsm. Не думаю, что будет что-то, что покажется вам странным. Да, некоторые имена могут отличаться, но когда вы понимаете соответствующий тип данных в C#, это будет иметь больше смысла.

Хорошо, в следующей таблице показаны типы .NET и то, как они представлены в ILAsml:

Как видите, ничего сложного при вводе в сравнительную таблицу. Мы также можем заметить, что не каждый тип присутствует на всех других платформах. Теперь позвольте мне сказать вам кое-что, что может сыграть важную роль в вашем коде.

CLS расшифровывается как Common Language Specification. Из названия мы уже можем видеть, к чему все идет. Но даже в этом случае совместимость с CLS сводится к следующему: убедитесь, что ваш код (dll или фреймворк) может использоваться/выполняться на любом языке CLR. Это означает, что если я пишу код, совместимый с CLS, на C#, должна быть возможность использовать тот же фрагмент кода на F#. Итак, теперь я надеюсь, что мой комментарий о том, что по имени мы можем понять, к чему все идет, имеет больше смысла. Это довольно простая концепция. Простой и в то же время мощный. Не поймите меня неправильно. Это не новая концепция, но одна из лучших реализаций, которые я видел.

С другой стороны, действительно трудно найти необходимость сделать ваши библиотеки/фреймворки в той же компании/проекте совместимыми с CLS. Если вы хотите отправить что-то на сервер NuGet, чтобы каждый мог его использовать, я бы серьезно подумал об этом.

Но что, если мне нужен какой-то тип данных, который здесь не определен? Ну, если мы помним, что в основе всего в .NET лежит объект. Исходя из этого, мы можем предположить, что мы можем использовать другие типы данных в ILAsm. И мы были бы правы. Вам просто нужно быть более явным при написании кода, но вы можете сделать это без каких-либо проблем.

Хорошо, вернемся к теме. Теперь, когда мы увидели типы данных, мы можем продолжить вторую часть этого поста. Объявление переменной.

Переменные, вы можете это сделать?

ILAsm не является исключением для всех других языков, которые так или иначе имеют возможность объявлять переменные. Синтаксис немного отличается от языков ООП, но этого и следовало ожидать. Теперь давайте попробуем написать нашу первую программу, которая объявляет и использует локальную переменную. Этот пример будет довольно простым, мы объявим две переменные (строкового типа) и напечатаем «Hello World».

.assembly extern mscorlib {}
.assembly Example
{
  .ver 1:0:1:0
}
.module example.exe
.method static void main() cil managed
{
  .entrypoint
  
	.locals init (string, string)
	ldstr "Hello "
	stloc.0
	ldstr "World"
	stloc.1
	ldloc.0
	call void [mscorlib]System.Console::Write(string)
	ldloc.1
	call void [mscorlib]System.Console::Write(string)
	ret
}

Вот. Ничего сложного. Директива .locals используется для объявления переменных. Это нужно сделать до того, как переменная будет использована (знаю, новаторское открытие). В приведенном выше примере мы объявили две переменные типа string. После этого мы используем нашу старую директиву для загрузки первой части строки для вывода. Доступ к переменным в ILAsm можно получить по индексу. Директивы stloc.0/ldloc.0 и stloc.1/ldloc.1 делают именно это.

Заключительный акт

Теперь у вас есть некоторое представление о типах данных и переменных в IL. Честно говоря, ничего сложного. Но для игры с более сложными примерами это необходимо. В следующей главе, посвященной теме IL, я буду иметь дело с ветвлением в IL. А пока развлекайтесь.