Знайомство з microsoft

Зміст

Microsoft .NET Framework є ключовим компонентом Microsoft .NET і служить платформою для створення, впровадження і виконання Web-сервісів і додатків. Вона надає засновану на стандартах високопродуктивну багатомовну середу, в якій виконуються різноманітні типи додатків і сервісів.

У цій та наступних частинах статті ми ознайомимося з Microsoft .NET Framework, з її основними компонентами - Common Language Runtime (CLR), бібліотекою класів і ASP.NET, розглянемо призначення кожного з них, архітектуру, складові частини, а також наведемо приклади їх використання .

Основні компоненти Microsoft .NET Framework на діаграмі (рис. 1).

Компонент Common Language Runtime, детально розглянутий в даній статті, розташовується над сервісами операційної системи, яка у даний час є операційною системою Windows, але в подальшому такий може бути практично будь-яка програмна платформа. Основне призначення CLR - виконання додатків, дотримання всіх програмних залежностей, управління пам'яттю, забезпечення безпеки, інтеграція з мовами програмування і т.п. Середовище виконання забезпечує безліч сервісів, що полегшують створення і впровадження програм, і істотно підвищує надійність останніх.

Розробники не взаємодіють з Common Language Runtime безпосередньо - всі сервіси надаються уніфікованої бібліотекою класів, яка розташовується над CLR. Ця бібліотека містить більше 1000 класів для вирішення різних програмних завдань - від взаємодії з сервісами операційної системи до роботи з даними і XML-документами.

Частиною зазначеної бібліотеки класів є програмна модель для створення Web-додатків, звана ASP.NET. Вона модель містить класи, компоненти і сервіси, що полегшують створення Web-сервісів і додатків. Відзначимо, що крім Web-сервісів і Web-додатків за допомогою Microsoft .NET Framework можна створювати і інші типи додатків - консольні додатки, додатки на основі Windows Forms і Windows-сервіси. Але оскільки основним завданням Microsoft .NET Framework є підтримка створення Web-додатків, саме компонент ASP.NET грає найбільш значну роль в архітектурі Microsoft .NET Framework.

На самому нижньому рівні нашої діаграми (див. Рис. 1) розташовуються сервіси операційної системи. Сервіси платформи Windows забезпечують підтримку таких технологій, як COM +, а також управління транзакціями, чергами повідомлень і т.п.

Після того як ми розглянули основні компоненти Microsoft .NET Framework, перейдемо до більш докладного вивчення найважливішого з них - Common Language Runtime.

Компонент Common Language Runtime

Common Language Runtime забезпечує середовище виконання .NET-додатків. Серед наданих цим середовищем функцій слід зазначити обробку виняткових ситуацій, забезпечення безпеки, засоби налагодження підтримки версій. Всі ці функції доступні з будь-якої мови програмування, відповідного специфікації Common Language Specification. Microsoft надає три мови програмування, здатних використовувати CLR, - Visual Basic .NET, Visual C # .NET і Visual C ++ With Managed Extensions. Крім того, ряд третіх фірм працює над .NET-версіями таких мов програмування, як Perl, Python і COBOL.

  • для виявлення класів;
  • завантаження класів;
  • генерації коду для конкретної платформи;
  • забезпечення безпеки.

Середовище виконання також стежить за часом життя об'єктів. В COM / COM + з цією метою використовувалися спеціальні лічильники (reference counter); в CLR теж використовуються лічильники, а видалення об'єктів з пам'яті відбувається за допомогою процесу, званого складанням сміття (garbage collection).

Common Language Runtime також задає загальну систему типів, використовувану усіма мовами програмування. Це означає, наприклад, що всі мови програмування оперуватимуть цілочисельними даними або даними з плаваючою точкою єдиного формату і єдиної довжини, а уявлення рядків теж будуть єдиними для всіх мов програмування. За рахунок єдиної системи типів досягається більш проста інтеграція компонентів та коду, написаних на різних мовах програмування. На відміну від COM-технології, також заснованої на наборі стандартних типів, але подаються в бінарному вигляді, CLR дозволяє виконувати інтеграцію коду (який може бути написаний на різних мовах програмування) в режимі дизайну, а не в режимі виконання.

Після компіляції керований код містить метадані, що описують сам компонент, а також компоненти, що використовувалися для створення коду. Середовище виконання перевіряє, чи доступні всі необхідні ресурси. Використання метаданих дозволяє відмовитися від необхідності зберігати інформацію про компоненти в реєстрі. Отже, при перенесенні компонента на інший комп'ютер нам більше не потрібно реєструвати цей компонент (за винятком глобальної збірки - global assembly, яку ми розглянемо нижче), а видалення компонента зводиться до простого видалення містить його збірки.

Як видно з наведеного вище функціонального опису Common Language Runtime, Виконавча забезпечує ряд переваг, що полегшують створення, виконання та впровадження .NET-додатків.

Виконувані файли і метадані

А тепер більш докладно зупинимося на концепції метаданих. Почнемо з того, що створимо примітивну програму на VB.NET. Ця консольна програма виводить рядок "Running under .NET" на стандартний пристрій виводу і завершує своє виконання. Код цієї програми такий:

Sub Main ()
Console.WriteLine ( "Running under .NET")
End Sub
End Module

Директива Imports вказує на те, що ми використовуємо класи, реалізовані в просторі імен System. Одним з таких класів є клас Console. Метод WriteLine цього класу ми використовуємо для виведення рядка на екран. Відкомпілюємо цю програму (рис. 2) за допомогою пакетного компілятора VB.NET:

В результаті компіляції ми отримуємо виконуваний файл CONS.EXE, який містить файлів формату COFF / PE з додатковими секціями, що містять інформацію, необхідну для Common Language Runtime. Ми можемо переконатися в цьому, виконавши команду DUMPBIN:

dumpbin cons.exe / all

На лістингу 1 наведено фрагмент дампа виконуваного файлу (показані тільки основні елементи).

Дамп виконуваного файлу для .NET починається з звичайних заголовків для MS-DOS і COFF-заголовка, стандартних по відношенню до всіх Windows-програм. Далі ми побачимо, що наша програма - це 32-бітна Windows-програма (PE32). У секції даних # 1 розташовуються CLR-заголовок і дані. Відзначимо, що ця секція має атрибути Code і Execute Read, що вказують завантажувачу на те, що в секції міститься код, який буде виконуватися середовищем виконання.

Після того як ми розглянули вміст файлу, що виконується, звернемося до тієї його секції, де розміщуються код і метадані.

За допомогою ILDASM можна зберегти в текстовому файлі дамп нашого виконуваного файлу. В результаті ми отримаємо більш докладний опис заголовка, вже розглянутого вище, а також додаткову інформацію, використовувану CLR. На лістингу 2 показаний фрагмент дампа, який містить секції, про які ми розповімо далі.

Як видно з наведеного фрагменту дампа, в ньому міститься вся необхідна інформація про нашу програму. Перша інструкція на мові IL (.assembly) містить вказівку на зовнішню збірку - mscorlib. Наступна інструкція також містить посилання на зовнішню збірку. Це буде набір класів для підтримки програм на Visual Basic, реалізований в збірці Microsoft, - Microsoft.VisualBasic. Далі йде інструкція, що описує нашу програму (у вигляді збірки) і власне код. Відзначимо, що нашій програмі присвоєно унікальний глобальний ідентифікатор (GUID).

Зверніть увагу на те, що наш клас Cons є спадкоємцем класу System.Object - базового класу бібліотеки класів .NET Framework. Як видно з коду нашої програми, ми не вказували цього успадкування безпосередньо - цей факт автоматично доданий компілятором. Клас має два методи. Метод Main () є статичним методом, який реалізований в коді нашої програми. Другий метод - конструктор ctor (), автоматично доданий компілятором. Конструктор дозволяє іншим програмам створювати екземпляри нашого застосування.

Microsoft Intermediate Language

У наведеному вище дампі навмисно пропущена важлива частина - код на мові IL. Коли ми компілюємо наш код, результатом цього процесу стає код на мові, зрозумілій конкретній платформі, а код на проміжному мовою, званому Microsoft Intermediate Language (MSIL), який представляє собою набір інструкцій, що не залежать від конкретного процесора. Нижче наведено IL-код нашого методу Main ():

.method public static void Main () cil managed
<
.entrypoint
.custom instance void
[Mscorlib] System.STAThreadAttribute. ctor () = (01 00 00 00)
// Code size 11 (0xb)
.maxstack 8
IL_0000: ldstr "Running under .NET"
IL_0005: call void
[Mscorlib] System.Console :: WriteLine (string)
IL_000a: ret
> // end of method Cons :: Main

Якщо опустити пролог, наш код займає 8 осередків стека і складається з 3 інструкцій. Перша інструкція - ldstr - завантажує рядок в стек. Інструкція call викликає вказаний метод з збірки і передає їй параметр. Виконання завершується інструкцією ret. Незважаючи на те що мова IL є досить простим, писати програми на ньому не має особливого сенсу, однак загальне розуміння інструкцій може допомогти вам розібратися в логіці роботи програм, а також ядра .NET Framework. (Додаткову інформацію можна отримати з специфікації Common Language Infrastructure, Partition 3. CIL Instruction Set, доступною на Web-сайті фірми Microsoft.)

Програма на мові IL залишається незмінною до тих пір, поки ми не викличемо на виконання той файл, в якому вона зберігається. У момент, коли управління передається середовищі виконання, IL-код перетворюється в код для конкретної платформи. Це завдання виконує компілятор, званий Just-In-Time Compiler (JIT). Теоретично тільки вказаний компілятор є компонентом .NET, що залежать від конкретної платформи. Однак насправді від платформи також залежать і значна частина бібліотеки класів, і ряд інших компонентів, наприклад такі компоненти платформи .NET:

mscorlib
System
System.Design
System.Drawing
System.Windows.Forms

Проте, існує реальна можливість наявності .NET для не-Windows-платформ, і, можливо, вже найближчим часом ми побачимо реалізації .NET для Linux.

Слід також звернути увагу на те, що з .NET-програм Ви можете безпосередньо перейти функції Windows API. У цьому випадку наші програми будуть прив'язані до конкретної платформі, і перенести їх без зміни коду буде неможливо.

Цікаво, що JIT-компілятор не виконує компіляцію всього IL-коду при першому зверненні до програми. Замість цього кожен метод компілюється при першому зверненні до нього, і, таким чином, не використовуваний код не компілюється. Відкомпільований код зберігається в пам'яті, а наступні звернення до програми виконують вже відкомпільований код. Microsoft надає спеціальний компілятор CLR Native Image Generator (NGEN), який виконує компіляцію всього IL-коду і зберігає результат на диску (рис. 4).

На рис. 5 представлені пояснення до циклу програм під керуванням .NET.

При розповіді про Common Language Runtime ми неодноразово використовували термін "збірка" (assembly). Збірка являє собою колекцію з одного або більше файлів. Часто ці файли містять код, але до складу збірки можуть також входити і графічні зображення, і ресурси, і інші бінарні дані, асоційовані з кодом. Такі збірки називаються статичними збірками, оскільки вони зберігаються на диску. Динамічні збірки створюються під час виконання програми і на диску зазвичай не зберігаються.

На рис. 6 показані збірки, що складаються з одного і декількох файлів.

Як видно з малюнка, маніфест містить наступну інформацію про збірку:

  • ім'я збірки;
  • версію;
  • файли в даній збірці;
  • збірки, використовувані даної складанням.

Крім стандартних полів в маніфесті можуть бути присутніми додаткові поля, що задаються програмістами.

Використання збірок і номерів версії може вирішити проблему сумісності між різними версіями DLL, відому як DLL Hell. Тепер .NET-програми шукають збірки в локальному каталозі, що дозволяє одночасно використовувати кілька версій однієї і тієї ж збірки без всяких проблем. (Додаткову інформацію можна отримати, прочитавши специфікацію Common Language Infrastructure, Partition 2. Metadata Definition and Semantics, доступну на Web-сайті фірми Microsoft.)

Global Assembly Cache

В наступній частині статті ми розглянемо останній компонент Common Language Runtime - Common Type System. (Додаткова інформація про Common Language Runtime мається на специфікації Common Language Infrastructure, Partition 1. Concepts and Architecture на Web-сайті фірми Microsoft.)