Framework class library что это

Обновлено: 03.07.2024

Пример 1

Для начала создадим и запустим консольное приложение Hello World (я буду использовать PowerShell для Windows, но в Bash для macOS или Linux все делается аналогично).

Команда dotnet new делает то же самое, что элемент меню File – New Project в Visual Studio. С её помощью можно создавать проекты различных типов. Используйте команду dotnet new , чтобы вывести список предустановленных шаблонов.

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

Переименуем файл Class1.cs в HelloWorld.cs .

Чтобы использовать класс HelloWorld , нужно добавить в приложение hello ссылку на библиотеку, в которой содержится логика. Для этого можно изменить файл проекта или воспользоваться командой dotnet add reference .

Теперь изменим файл Program.cs так, чтобы в нем использовался класс HelloWorld .

Обновление файла Program.cs для дальнейшего использования класса HelloWorld:

Чтобы собрать и запустить приложение, введите команду dotnet run .

В командной строке также можно создавать тесты. Этот CLI поддерживает MSTest , а также популярную платформу xUnit . Давайте для примера воспользуемся xUnit.

Чтобы добавить тест, измените содержимое файла UnitTest1.cs , как показано ниже.

Добавление теста в файл UnitTest1.cs:

Теперь можно запустить тесты с помощью команды dotnet test .

Пример 2

Чтобы запустить тестовый веб-сервер, вновь введите команду dotnet run .

Откройте в браузере URL-адрес, который был выведен в консоли (это должен быть адрес localhost:5000).

Сейчас структура вашего проекта должна соответствовать вот такой структуре.

Структура созданного проекта:

Чтобы упростить редактирование файлов в Visual Studio, создадим файл решения *.SIN и добавим в него все проекты.

BCL — это набор базовых API, не зависящих от инфраструктур пользовательского интерфейса и моделей приложений. В него входят простые типы, файловый ввод-вывод, сетевые API, API сериализации, XML и другое.

Пример 3

Сравним его с файлом проекта консольного приложения hello.

Пример 4

Эта библиотека поддерживает дополнительные типы коллекций, которых нет в BCL. Один из них — тип Bag , не гарантирующий какого-либо порядка элементов. Изменим наше приложение hello так, чтобы в нем использовался этот тип.

Пример приложения с использованием PowerCollections:

Если вы запустите программу, то увидите следующее:

Компилятор выкинул warning но программа отработала!

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

Заключение

Сегодня мы более подробно рассмотрим, каждый из этих компонентов.
CLR

На компьютере храниться в виде файла динамической библиотеки mscoree.dll, в проекте данная сборка подключается автоматически.

osnovnye-komponenty-net-framework-clr-i-framework_1.jpg

osnovnye-komponenty-net-framework-clr-i-framework_2.jpg

Какие задачи решает CLR?

  1. Загрузка пользовательских сборок
  2. Управление памятью
  3. Работа с потоками
  4. Безопасность выполнения кода
  5. Очистка памяти (сборщик мусора)
  6. и многое другое

osnovnye-komponenty-net-framework-clr-i-framework_3.jpg

CTS (Common Type System) – система общих типов.

Это детальное описание (спецификация) всех типов данных и программных конструкций, поддерживаемых исполняющей средой.

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

Важно знать то, что CTS предоставляет разработчикам 5 типов. О них я уже писал ранее, но повторюсь ещё раз.

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

Какие задачи решает CTS?

  1. Обеспечивает многоязыковую поддержку
  2. ООП
  3. Описывает характеристики членов. Например: доступность: public, private, protected
  4. Определяет правила, которых нужно придерживаться языкам, чтобы типы и объекты написанные на разных языках мог бы взаимодействовать между собой

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

// int a = 5;
// System.Int32 b = 10;
CLS

Как видно из описания, понимание CLS требуется в основном разработчикам компиляторов, рядовым разработчикам данная информация вряд ли пригодиться.

В итоге мы получаем примерно вот такую структуру:

osnovnye-komponenty-net-framework-clr-i-framework_4.jpg

  1. BCL (Base Class Library) библиотека базовых классов
  2. FCL (Framework Сlass Library) библиотека классов платформы

osnovnye-komponenty-net-framework-clr-i-framework_5.jpg

Данная библиотека подключается автоматически во время создания проекта, так же стоит понимать, что существуют и другие файлы сборки базовых библиотек.
Framework Class Library (FCL)

В принципе можно сказать, что Framework Class Library включает в себя библиотеку базовых классов BCL, которая, по сути, является её ядром.

Такую официальную формулировку так же приводят: MSDN, Wiki и многие другие авторы книг.

Но мы знаем, что FCL включает в себя библиотеки базовых классов. И правильнее формулировка должна звучать так:

Имена нынешнего поколения продуктов от Microsoft сопровождаются окончанием . Net (читается Dot Net ), отражающим видение Microsoft современного коммуникативного мира. Компьютерные сети объединяют людей и технику. Человек, работающий с компьютером или использующий мобильный телефон , естественным образом становится частью локальной или глобальной сети. В этой сети используются различные специальные устройства, начиная от космических станций и заканчивая датчиками, расположенными, например, в гостиницах и посылающими информацию об объекте всем мобильным устройствам в их окрестности. В глобальном информационном мире коммуникативная составляющая любых программных продуктов начинает играть определяющую роль.

Открытость

  • статический - FCL (Framework Class Library) - библиотеку классов каркаса;
  • динамический - CLR (Common Language Runtime) - общеязыковую исполнительную среду.

Библиотека классов FCL - статический компонент каркаса

Понятие каркаса приложений - Framework Applications - появилось достаточно давно; по крайней мере оно широко использовалось еще в четвертой версии Visual Studio. Десять лет назад, когда я с Ильмиром писал книгу [В.А. Биллиг, И.Х. Мусикаев "Visual C++, 4-я версия. Книга для программистов"], для нас это было еще новое понятие. Мы подробно обсуждали роль библиотеки классов MFC (Microsoft Foundation Classes) как каркаса приложений Visual C. Несмотря на то, что каркас был представлен только статическим компонентом, уже тогда была очевидна его роль в построении приложений. Уже в то время важнейшее значение в библиотеке классов MFC имели классы, задающие архитектуру строящихся приложений. Когда разработчик выбирал один из возможных типов приложения, например, архитектуру Document-View, то в его приложение автоматически встраивались класс Document, задающий структуру документа, и класс View, задающий его визуальное представление. Класс Form и классы, задающие элементы управления, обеспечивали единый интерфейс приложений. Выбирая тип приложения, разработчик изначально получал нужную ему функциональность, поддерживаемую классами каркаса. Библиотека классов поддерживала и более традиционные для программистов классы, задающие расширенную систему типов данных, в частности, динамические типы данных - списки, деревья, коллекции, шаблоны.

За прошедшие 10 лет роль каркаса в построении приложений существенно возросла - прежде всего, за счет появления его динамического компонента, о котором чуть позже поговорим подробнее. Что же касается статического компонента - библиотеки классов, то и здесь за десять лет появился ряд важных нововведений.

Единство каркаса

Каркас стал единым для всех языков среды. Поэтому, на каком бы языке программирования ни велась разработка, она использует классы одной и той же библиотеки. Многие классы библиотеки, составляющие общее ядро, используются всеми языками. Отсюда единство интерфейса приложения, на каком бы языке оно не разрабатывалось, единство работы с коллекциями и другими контейнерами данных, единство связывания с различными хранилищами данных и прочая универсальность.

Встроенные примитивные типы
Структурные типы

Частью библиотеки стали не только простые встроенные типы , но и структурные типы , задающие организацию данных - строки, массивы, перечисления, структуры (записи). Это также способствует унификации и реальному сближению языков программирования.

Архитектура приложений
Модульность

Число классов библиотеки FCL велико (несколько тысяч). Поэтому понадобился способ их структуризации. Логически классы с близкой функциональностью объединяются в группы, называемые пространством имен (Namespace). Для динамического компонента CLR физической единицей, объединяющей классы и другие ресурсы, является сборка (assembly).

Основным пространством имен библиотеки FCL является пространство System, содержащее как классы, так и другие вложенные пространства имен. Так, уже упоминавшийся примитивный тип Int32 непосредственно вложен в пространство имен System и его полное имя, включающее имя пространства - System.Int32 .

В пространство System вложен целый ряд других пространств имен. Например, в пространстве System.Collections находятся классы и интерфейсы, поддерживающие работу с коллекциями объектов - списками, очередями, словарями. В пространство System.Collections , в свою очередь, вложено пространство имен Specialized , содержащее классы со специализацией, например, коллекции, элементами которых являются только строки. Пространство System.Windows.Forms содержит классы, используемые при создании Windows-приложений. Класс Form из этого пространства задает форму - окно, заполняемое элементами управления, графикой, обеспечивающее интерактивное взаимодействие с пользователем.

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

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

  • поддержку базовых и определяемых пользователями типов;
  • поддержку обработки исключительных ситуаций;
  • операции ввода/вывода и работу с потоками;
  • обращение к функциям операционной системы;
  • доступ к данным;
  • возможность создания Windows-приложений;
  • возможность создания клиентских и серверных Web-приложений;
  • возможность создания Web-сервисов.

Класс Console и консольные приложения

Console.WriteLine(".NET Console application")
Console.ReadLine()

Методы Read и ReadLine служат для чтения одного или более символов или символа новой строки из стандартного потока ввода, а методы Write и WriteLine - для вывода одного или более символов либо строки с символом новой строки в стандартный поток вывода.

Методы SetIn, SetOut и SetError позволяют переопределить стандартные потоки ввода, вывода и ошибок. Эти методы ожидают аргумент типа TextWriter, который описывает поток.

Пространство имен System

Кратко рассмотрим каждый из этих методов:

  • Метод Equals (Object) или Equals (Object, Object) - служит для проверки, являются ли два объекта одним и тем же экземпляром. Для данных со значениями этот метод переопределен (в классе ValueType) и позволяет проверить идентичность хранимых экземплярами объекта значений. Обратите внимание: когда мы сравниваем два ссылочных типа, метод Equals проверяет, являются ли оба экземпляра идентичными; для данных со значениями метод Equals также проверяет идентичность данных, хранимых экземплярами объекта.
  • Метод ReferenceEquals (Object, Object) проверяет, являются ли два объекта одним и тем же экземпляром класса.
  • Метод Finalize() по умолчанию не выполняет никаких действий. Этот метод может быть переопределен в унаследованных классах для выполнения финальной очистки памяти перед тем, как механизм сборки мусора (Garbage Collector) уничтожит данный объект.
  • Метод GetHashCode() служит для генерации хэш-значений (типа Integer), которые могут быть использованы для хранения объектов в хэш-таблицах.
  • Метод MemberwiseClone() создает точную копию объекта.
  • Метод ToString() возвращает текстовое представление объекта. В большинстве случаев этот метод возвращает полное имя класса для данного объекта.
  • Метод GetType() возвращает объект типа Type для данного экземпляра класса.

Ниже мы расскажем, как используется класс Type.

Класс Type и пространство имен Reflection

Класс Type содержит методы типа GetMethods() и GetProperties(), которые могут использоваться для получения информации о членах класса. Используя классы, реализованные в пространстве имен Reflection, мы можем получать сведения, например, о параметрах методов (используя класс System.Reflection. MethodInfo) и даже вызывать методы с помощью метода Invoke().

В следующем примере показано, как начать использовать механизм отражений. Приведенный ниже код показывает, как с помощью метода GetType() получить объект Type и каким образом можно применять ряд свойств этого объекта:

Imports System
Imports System.Reflection

Dim I As Integer
Dim T As Type

Imports System
Imports System.Reflection

Dim I As Integer
Dim T As Type
Dim Types() As Type
Dim M As [Module]

T = I.GetType()
M = T.Module
Types = M.GetTypes()
For Each T In Types
Console.WriteLine(T.FullName)
Next

Ниже показана выводимая данным кодом информация:

Теперь расширим наш пример и добавим информацию о свойствах, конструкторах, методах, интерфейсах и событиях. Для этого воспользуемся методами GetProperties(), GetConstructors(), GetMethods(), GetInterfaces() и GetEvents() объекта Type. Каждый из этих методов возвращает массив элементов типа PropertyInfo, MethodInfo, EventInfo и т.п. - каждый тип наследует от абстрактного типа MemberInfo, который мы и используем в нашем примере. Исключение составляет только тип PropertyInfo - этот тип используется для того, чтобы получить дополнительную информацию о свойствах:

Imports System
Imports System.Reflection
Module Cons

Dim T As Type
Dim MI As MemberInfo
Dim Types() As Type
Dim Members() As MemberInfo
Dim M As [Module]
Dim PI As PropertyInfo
Dim PText As String
T = Type.GetType("System.Array")
Console.WriteLine(" : ", GetTypeDescription(T), T)

'
' Показать все свойства
'
Console.WriteLine("---- Свойства ----")
Members = T.GetProperties
For Each MI In Members
PI = MI
If PI.CanRead And PI.CanWrite Then
PText = "get; set;"
Else
If PI.CanRead Then
PText = "get"
Else
If PI.CanWrite Then
PText = "set"
End If
End If
End If
Console.WriteLine(" : ", vbTab, "Prop", _
PText, MI.ToString)
Next

'
' Показать все конструкторы
'

Console.WriteLine("---- Конструкторы ----")
Members = T.GetConstructors(BindingFlags.Public Or _
BindingFlags.Static Or BindingFlags.NonPublic Or _
BindingFlags.Instance)
For Each MI In Members
Console.WriteLine(" : ", vbTab, "Meth", _
MI.ToString)
Next

'
' Показать все методы
'
Console.WriteLine("---- Методы ----")
Members = T.GetMethods
For Each MI In Members
Console.WriteLine(" : ", vbTab, "Meth", MI)
Next

'
' Показать все интерфейсы
'
Console.WriteLine("---- Интерфейсы ----")
Members = T.GetInterfaces
For Each MI In Members
Console.WriteLine(" : ", vbTab, "Intf", _
MI.ToString)
Next

'
' Показать все события
'
Console.WriteLine("---- События ----")
Members = T.GetEvents
For Each MI In Members
Console.WriteLine(" : ", vbTab, "Evnt", _
MI.ToString)
Next
'Next

Private Function GetTypeDescription(ByVal aType As Type) As String
Dim str As String = Nothing

If aType.IsClass Then
str = "Class"
End If

If aType.IsInterface Then
str = "Interface"
End If

If aType.IsValueType Then
str = "Struct"
End If

If aType.IsArray Then
str = "Array"
End If

Return str
End Function 'GetTypeDescription

Ниже показана информация, выводимая нашим примером для класса System.Array:

Class : System.Array
---- Свойства ----
Prop : get Int32 Length
Prop : get Int32 Rank
Prop : get System.Object SyncRoot
Prop : get Boolean IsReadOnly
Prop : get Boolean IsFixedSize
Prop : get Boolean IsSynchronized
---- Конструкторы ----
Meth : Void .ctor()
---- Методы ----
Meth : System.Collections.IEnumerator GetEnumerator()
Meth : Boolean get_IsSynchronized()
Meth : System.Object get_SyncRoot()
Meth : Void CopyTo(System.Array, Int32)
Meth : Boolean get_IsFixedSize()
Meth : Boolean get_IsReadOnly()
Meth : System.Object Clone()
Meth : Int32 GetHashCode()
Meth : Boolean Equals(System.Object)
Meth : System.String ToString()
Meth : System.Array CreateInstance(System.Type, Int32)
Meth : System.Array CreateInstance(System.Type, Int32, Int32)
Meth : System.Array CreateInstance(System.Type, Int32, Int32, Int32)
Meth : System.Array CreateInstance(System.Type, Int32[])
Meth : System.Array CreateInstance(System.Type, Int32[], Int32[])
Meth : Void Copy(System.Array, System.Array, Int32)
Meth : Void Copy(System.Array, Int32, System.Array, Int32, Int32)
Meth : Void Clear(System.Array, Int32, Int32)
Meth : System.Object GetValue(Int32[])
Meth : System.Object GetValue(Int32)
Meth : System.Object GetValue(Int32, Int32)
Meth : System.Object GetValue(Int32, Int32, Int32)
Meth : Void SetValue(System.Object, Int32)
Meth : Void SetValue(System.Object, Int32, Int32)
Meth : Void SetValue(System.Object, Int32, Int32, Int32)
Meth : Void SetValue(System.Object, Int32[])
Meth : Int32 get_Length()
Meth : Int32 GetLength(Int32)
Meth : Int32 get_Rank()
Meth : Int32 GetUpperBound(Int32)
Meth : Int32 GetLowerBound(Int32)
Meth : Int32 BinarySearch(System.Array, System.Object)
Meth : Int32 BinarySearch(System.Array, Int32, Int32, System.Object)
Meth : Int32 BinarySearch(System.Array, System.Object,
System.Collections.IComparer)
Meth : Int32 BinarySearch(System.Array, Int32, Int32, System.Object,
System.Collections.IComparer)
Meth : Int32 IndexOf(System.Array, System.Object)
Meth : Int32 IndexOf(System.Array, System.Object, Int32)
Meth : Int32 IndexOf(System.Array, System.Object, Int32, Int32)
Meth : Int32 LastIndexOf(System.Array, System.Object)
Meth : Int32 LastIndexOf(System.Array, System.Object, Int32)
Meth : Int32 LastIndexOf(System.Array, System.Object, Int32, Int32)
Meth : Void Reverse(System.Array)
Meth : Void Reverse(System.Array, Int32, Int32)
Meth : Void Sort(System.Array)
Meth : Void Sort(System.Array, System.Array)
Meth : Void Sort(System.Array, Int32, Int32)
Meth : Void Sort(System.Array, System.Array, Int32, Int32)
Meth : Void Sort(System.Array, System.Collections.IComparer)
Meth : Void Sort(System.Array, System.Array, System.Collections.IComparer)
Meth : Void Sort(System.Array, Int32, Int32, System.Collections.IComparer)
Meth : Void Sort(System.Array, System.Array, Int32, Int32,
System.Collections.IComparer)
Meth : Void Initialize()
Meth : System.Type GetType()
---- Интерфейсы ----
Intf : System.ICloneable
Intf : System.Collections.IList
Intf : System.Collections.ICollection
Intf : System.Collections.IEnumerable

Обратите внимание на то, что параметры методов не имеют названий - в листинге показаны только типы данных. Чтобы получить более подробную информацию о параметрах методов, мы должны воспользоваться методом GetParameters() и структурой ParameterInfo. Как это сделать, показано ниже:

'
' Показать все методы
'
Console.WriteLine("---- Методы ----")
Members = T.GetMethods
For Each MI In Members
PAInfo = CType(MI, MethodInfo).GetParameters
If PAInfo.Length > 0 Then
Console.WriteLine(" : ", vbTab, "Meth", MI.Name, "(")
For Each PAI In PAInfo
Console.WriteLine(" : ", vbTab, PAI.Name, _
PAI.ParameterType.ToString)
Next
Console.WriteLine("", vbTab, ")")
Else
Console.WriteLine(" : ", vbTab, "Meth", MI.Name, _
"()")
End If
Next

Теперь мы знаем названия параметров и их тип:

---- Методы ----
Meth : GetEnumerator()
Meth : get_IsSynchronized()
Meth : get_SyncRoot()
Meth : CopyTo(
array : System.Array
index : System.Int32
)
Meth : get_IsFixedSize()
Meth : get_IsReadOnly()
Meth : Clone()
Meth : GetHashCode()
Meth : Equals(
obj : System.Object
)
Meth : ToString()
Meth : CreateInstance(
elementType : System.Type
length : System.Int32
)

Для того чтобы получить доступ к сборке (в нашем примере мы использовали сборку по умолчанию (- mscorlib.dll), всегда загруженную в память), надо обратиться к этой сборке. Вот как это сделать:

Imports System.Reflection
Imports System.IO
Imports Microsoft.Win32
Imports Microsoft.VisualBasic

Dim Asm As [Assembly]
Dim Mdls As [Module]()
Dim Mdl As [Module]
Asm = [Assembly].LoadFrom(GetNetFrameworkPath() + _
"system.windows.forms.dll")
Mdls = Asm.GetModules
Mdl = Mdls(0)

Function GetNetFrameworkPath() As String

Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\.NETFramework")
GetNetFrameworkPath = CType(Key.GetValue("InstallRoot"), String) + _
CType(Key.GetValue("Version"), String) + "\"

После того как мы получили доступ к модулю, мы можем либо изучить определенные в нем типы (как это сделать, показано в первом примере), либо получить информацию об интересующем нам типе.

Имена нынешнего поколения продуктов от Microsoft сопровождаются окончанием .Net (читается Dot Net), отражающим видение Microsoft современного коммуникативного мира. Компьютерные сети объединяют людей и технику. Человек, работающий с компьютером или использующий мобильный телефон, естественным образом становится частью локальной или глобальной сети. В этой сети используются различные специальные устройства, начиная от космических станций и кончая датчиками, расположенными, например, в гостиницах и посылающими информацию об объекте всем мобильным устройствам в их окрестности. В глобальном информационном мире коммуникативная составляющая любых программных продуктов начинает играть определяющую роль.

· открытость для языков программирования;

Открытость

· статический - FCL (Framework Class Library) - библиотеку классов каркаса;

· динамический - CLR (Common Language Runtime) - общеязыковую исполнительную среду.

Библиотека классов FCL - статический компонент каркаса

Понятие каркаса приложений - Framework Applications - появилось достаточно давно; по крайней мере оно широко использовалось еще в четвертой версии Visual Studio. Десять лет назад, когда я с Ильмиром писал книгу [В.А. Биллиг, И.Х. Мусикаев "Visual C++, 4-я версия. Книга для программистов"], для нас это было еще новое понятие. Мы подробно обсуждали роль библиотеки классов MFC (Microsoft Foundation Classes) как каркаса приложений Visual C. Несмотря на то, что каркас был представлен только статическим компонентом, уже тогда была очевидна его роль в построении приложений. Уже в то время важнейшее значение в библиотеке классов MFC имели классы, задающие архитектуру строящихся приложений. Когда разработчик выбирал один из возможных типов приложения, например, архитектуру Document-View, то в его приложение автоматически встраивались класс Document, задающий структуру документа, и класс View, задающий его визуальное представление. Класс Form и классы, задающие элементы управления, обеспечивали единый интерфейс приложений. Выбирая тип приложения, разработчик изначально получал нужную ему функциональность, поддерживаемую классами каркаса. Библиотека классов поддерживала и более традиционные для программистов классы, задающие расширенную систему типов данных, в частности, динамические типы данных - списки, деревья, коллекции, шаблоны.

За прошедшие 10 лет роль каркаса в построении приложений существенно возросла - прежде всего, за счет появления его динамического компонента, о котором чуть позже поговорим подробнее. Что же касается статического компонента - библиотеки классов, то и здесь за десять лет появился ряд важных нововведений.

Единство каркаса

Каркас стал единым для всех языков среды. Поэтому, на каком бы языке программирования ни велась разработка, она использует классы одной и той же библиотеки. Многие классы библиотеки, составляющие общее ядро, используются всеми языками. Отсюда единство интерфейса приложения, на каком бы языке оно не разрабатывалось, единство работы с коллекциями и другими контейнерами данных, единство связывания с различными хранилищами данных и прочая универсальность.

Читайте также: