Эта статья посвящена библиотеке базовых классов (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