Эта статья посвящена библиотеке базовых классов (BCL), среде CLR, общему промежуточному языку (CIL) и сборкам .NET.

Заранее давайте взглянем на библиотеку классов Framework (FCL), в которой вы можете увидеть так много других классов, функций и других служб, и эта статья охватывает библиотеку базовых классов и среду CLR.

Представляем стандартные блоки платформы .NET (CLR, CTS и CLS)

Теперь, когда вы поняли некоторые преимущества .NET, я собираюсь описать три ключевые темы, которые помогут вам лучше понять основные преимущества.

CLR (общеязыковая среда выполнения)

С точки зрения программиста, .NET может быть средой выполнения и всеобъемлющей библиотекой базовых классов.

Среда выполнения называется Common Language Runtime (CLR). Основная цель CLR - загружать, находить и управлять объектами .NET от имени программиста. Это означает, что CLR всегда обрабатывает эти операции, и программист не вмешивается в эти процессы. . Также CLR позаботится об управлении памятью, хостинге приложений, некоторых проверках безопасности и координации потоков.

CTS (система общих типов)

CTS описывает все типы данных и все связанные конструкции, которые поддерживаются средой выполнения, подробно описывает, как они будут представлены в формате метаданных .NET, а также определяет, как объекты могут взаимодействовать друг с другом. Другими словами, у нас есть несколько языков, и каждый язык имеет собственное определение типа данных и не может быть понят другим языком, но CLR может понимать все типы данных.

Например, C # имеет тип данных int, а VB.NET имеет тип данных Integer. Поэтому после компиляции он использует ту же структуру, что и Int32 в CTS.

CLS (Спецификация общего языка)

CLS - это подмножество CTS, оно определяет набор правил и ограничений, которым должен следовать каждый язык, работающий под .NET framework.

Например, представьте, что вы разрабатываете и применяете C # и VB.NET, в C # каждый оператор должен заканчиваться точкой с запятой, иначе в VB.NET не должно быть написано так.

Таким образом, эти правила синтаксиса отличаются от языков к языкам, но CLR может понимать синтаксис всех языков, потому что в .NET каждый язык преобразуется в код MSIL после компиляции, а код MSIL - это языковая спецификация CLR.

Библиотека базовых классов (BCL)

Обозначает библиотеку базовых классов, также известную как библиотека классов (CL). BCL - это подмножество библиотеки классов Framework (FCL). Библиотека классов - это коллекция многоразовых типов, которые тесно интегрированы с CLR. Библиотека базовых классов предоставляет классы и типы, которые полезны при выполнении повседневных операций, например. работа со строковыми и примитивными типами, подключение к базе данных, операции ввода-вывода.

BCL определяют типы, которые можно использовать для создания любого типа программного приложения.

Вы можете использовать ASP.NET для создания веб-сайтов и служб REST, WCF для создания распределенных систем, WPF для создания настольных приложений с графическим интерфейсом пользователя и т. Д. Кроме того, библиотеки базовых классов предоставляют типы для взаимодействия с каталогом и файловой системой на данном компьютере, для связи с реляционными базами данных (через ADO.NET) и т. Д.

Управляемый и неуправляемый код

Теперь, когда вы узнали определение BCL и CLR, я собираюсь поговорить об управляемом и неуправляемом коде.

Язык C # можно использовать только для создания программного обеспечения, размещенного в среде выполнения .NET. Термин, используемый для описания кода, ориентированного на среду выполнения .NET, - это управляемый код. Существует двоичный модуль, содержащий управляемый код, который называется сборкой. В отличие от кода, который не может быть размещен непосредственно в среде выполнения .ET, называется неуправляемым кодом.

Как я уже упоминал в предыдущей статье, платформа .NET может работать в различных операционных системах. Можно создать приложение C # в операционной системе Windows с помощью Visual Studio и запустить программу на компьютере с macOS, используя среду выполнения .NET Core. Кроме того, вы можете создать приложение C # в операционной системе Linux с помощью Xamarin Studio и запустить программу в Windows, macOS и т. Д. Последний выпуск Visual Studio, я имею в виду Visual Studio 2017, вы также можете создавать приложения .NET Core на Mac для запуска в Windows, macOS или Linux. Можно создавать, развертывать и запускать программы .NET на разных компьютерах. операционные системы.

Обзор сборок .NET

Независимо от того, какие языки .NET вы выбрали для разработки, после компиляции вашего приложения будет два типа сборок: исполняемые файлы * .exe и динамически подключаемые библиотеки * .dll.

Но когда мы компилируем нашу .NET-программу, она преобразуется не в исполняемый двоичный код, а в промежуточный код, называемый MSIL или IL, который понятен CLR. MSIL - это независимый от ОС и аппаратно-программного обеспечения код. Когда программа должна быть выполнена, этот MSIL или промежуточный код преобразуется в двоичный исполняемый код, называемый собственным кодом.

Все сборки .NET содержат определение типов, информацию о версиях для метаданных типа и манифест, и в этой статье я собираюсь поговорить об этом подробнее.

Если у вас есть класс с именем Customer, метаданные типа описывают детали, такие как базовый класс Customer, определяют, какие интерфейсы реализуются классом Customer, а также предоставляют некоторую информацию о каждом члене в классе Customer. Метаданные .NET всегда присутствуют в сборке и в ней. NET обязан автоматически его генерировать.

CIL и метаданные типа, сами сборки также описываются с помощью метаданных, которые называются manifest. Манифест содержит информацию о текущей версии сборки и список всех сборок, на которые имеются внешние ссылки, которые необходимы для правильного execute.so в следующей статье я собираюсь использовать инструмент для изучения типа сборки, метаданных и манифеста.

Роль CIL в .NET framework

Чтобы понять правило CIL, взгляните на следующий код C #, который моделирует калькулятор.

using System;  
  
namespace Calculator  
{  
      
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Calc cl=new Calc();  
            Console.WriteLine("13+31={0}",cl.AddNumbers(13,31));  
            Console.ReadLine();  
        }  
    }  
    //Calculator class which has a method Addnumbers  
    class Calc  
    {  
        public int AddNumbers(int x, int y)  
        {  
            return x + y;  
        }  
    }  
}

Как видите, у нас есть два класса,

  • Программа: точка входа в приложение.
  • Calc: в котором есть метод с именем Addnumbers, который добавляет два числа и возвращает результат сложения чисел.

После компиляции приложения с помощью компилятора C # (Calculator.exe) вы получите файл * .exe, содержащий манифест, метаданные и инструкции CIL.

Теперь давайте воспользуемся ildasm.exe, чтобы изучить наш файл Calculator.exe.

Вы можете найти файл ildasm.exe в C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ [ваша версия Windows] \ Bin

Если вы хотите использовать этот инструмент в Visual Studio, просто выполните следующие действия и добавьте его в инструменты Visual Studio,

  • Сначала найдите папку ildasm.exe (обычно она находится в C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ [Windows Verwsion] \ Bin \ ildasm.exe.
  • Откройте Visual Studio
  • В меню «Инструменты» откройте «Внешние инструменты», после чего вы должны увидеть диалоговое окно «Внешние инструменты»,

  • Нажмите кнопку добавления, выберите заголовок вашего инструмента (мой заголовок - ILDASM), в текстовом поле «Команда» введите путь к ildasm.exe, а в текстовом поле «Аргумент» просто нажмите кнопку со стрелкой вправо и выберите $ (TargetPath)
  • Отметьте Close и выйдите.
  • Готово.

Что предлагает ildasm.exe?

ildasm покажет вам три основных вещи,

  • Список всех классов и методов в вашей сборке
  • Содержимое манифеста сборки
  • Код IL для любого метода, реализованного в сборке.

Чтобы открыть связанную сборку, просто зайдите в меню инструментов, и мы идем, ILDASM появляется в этом меню, просто откройте его.

Итак, если вы хотите найти информацию о своем приложении, откройте ildasm в меню «Инструменты», и вы увидите диалоговое окно ildasm.exe.

Как видите, есть некоторая информация о типе сборки, манифесте и метаданных.

Если я разверну Calculator.Calc, появятся методы AddNumbers. Дважды щелкнув метод, я могу увидеть информацию об этом методе в новых диалоговых окнах.

Обратите внимание на тип данных int32, как вы помните, в начале этой статьи я говорил о CTS (Common Type System), в которой все типы данных после компиляции будут понятны для CTS. Любое int в C # или Integer в VB будет скомпилировано как int32 в CTS.

Как видите, метод AddNumbers представлен с использованием CIL, как показано на рисунке выше.

Преимущество CIL

Теперь вы узнали, что именно делает CIL, но почему это необходимо для компиляции вашего кода в CIL? Вы помните, как я сказал, вы можете использовать различные языки в .NET framework, вот преимущество использования CIL, независимо от того какой язык вы используете в своем проекте, может быть, один, может быть, два и так далее, в конце все они будут компилироваться в CIL, и все языки будут взаимодействовать в рамках четко определенной двоичной области.

Роль метаданных типа .NET

Сборка .NET содержит полные и точные метаданные, такие как класс, структура, а также члены каждого типа, такие как свойства, методы и т. Д. Итак, как извлечь эту информацию? Программистом или компилятором? Надеюсь, все эти задачи выполняет компилятор, а не программист.

Чтобы показать вам формат метаданных, давайте взглянем на метаданные нашего проекта, сгенерированные методом AddNumbers. Для этого просто откройте ildasm в меню «Инструменты» и после появления диалогового окна просто нажмите ctl + m, чтобы проиллюстрировать тип метаданных. вашего проекта.

Если вы нажмете ctl + m, а затем диалоговое окно исчезнет, ​​убедитесь, что вы открыли правильную версию ildasm. Если ваш проект создан с помощью .Net framework версии 4.6.1, и вы открываете ildasm с .NET framework версии 4.5.1, ваше диалоговое окно исчезнет после использования ctl + m.

как вы видите на картинке выше, у нас есть TypeDef # 2, который предоставляет некоторую информацию о проекте, например, TypeDefName относится к классу Calc в проекте Calculator, а также есть два метода в классе Calc,

  • AddNumbers
  • который принимает два параметра x и y
  • .ctor, который является конструктором по умолчанию для класса Calc и автоматически создается платформой .NET.

Роль манифеста сборки

Сборка .Net, которая содержит метаданные, описывающие саму сборку, как я уже упоминал ранее, называется Manifest.

Manifest документирует всю информацию о внешних сборках, такую ​​как номер версии сборки, информацию об авторских правах и т. Д., Поэтому создание манифеста сборки является обязанностью компилятора, а не программиста.

ресурс: pro C # 7 от Andrew Troelsen, Philip Japikse