Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Указание ссылок на внешние сборки в CIL
Скопируйте файлы
global.json
NuGet.config
CILTypes.ilproj
<Project Sdk="Microsoft.NET.Sdk.IL">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<MicrosoftNetCoreIlasmPackageVersion>
5.0.0-preview.1.20120.5
</MicrosoftNetCoreIlasmPackageVersion>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
</PropertyGroup>
</Project>
Затем создайте в текстовом редакторе новый файл по имени
CILTypes.il
System.Runtime.dll
.assembly
external
System.Runtime.dll
.publickeytoken
.ver
.assembly extern System.Runtime
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )
.ver 5:0:0:0
}
Определение текущей сборки в CIL
Следующее действие заключается в определении создаваемой сборки с использованием директивы
.assembly
<b>// Наша сборка.</b>
.assembly CILTypes{}
Хотя такой код действительно определяет новую сборку .NET Core, обычно внутрь объявления будут помещаться дополнительные директивы. В рассматриваемом примере определение сборки необходимо снабдить номером версии 1.0.0.0 посредством директивы
.ver
<b>// Наша сборка.</b>
.assembly CILTypes
{
<b> .ver 1:0:0:0</b>
}
Из-за того, что сборка
CILTypes
.module
CILTypes.dll
// Наша сборка
.assembly CILTypes
{
.ver 1:0:0:0
}
// Модуль нашей однофайловой сборки.
.module CILTypes.dll
Кроме
.assembly
.module

Определение пространств имен в CIL
Определив внешний вид и поведение сборки (а также обязательные внешние ссылки), вы можете создать пространство имен .NET Core (
MyNamespace
.namespace
<b>// Наша сборка имеет единственное пространство имен.</b>
.namespace MyNamespace {}
Подобно C# определения пространств имен CIL могут быть вложены в другие пространства имен. Хотя здесь нет нужды определять корневое пространство имен, ради интереса посмотрим, как создать корневое пространство имен
MyCompany
.namespace MyCompany
{
.namespace MyNamespace {}
}
Как и С#, язык CIL позволяет определить вложенное пространство имен следующим образом:
<b>// Определение вложенного пространства имен.</b>
.namespace MyCompany.MyNamespace {}
Определение типов классов в CIL
Пустые пространства имен не особо интересны, поэтому давайте рассмотрим процесс определения типов классов в CIL. Для определения нового типа класса предназначена директива
.class
MyBaseClass
System.Object
.namespace MyNamespace
{
<b> // Предполагается базовый класс System.Object.</b>
.class public MyBaseClass {}
}
При построении типа, производного не от класса
System.Object
extends
MyBaseClass