Програмування на керованому C++

13.07.2015

Програмування на керованому C++

Місце C++ в світі .NET

Одним з переваг платформи .NET є те, що для розробки додатків, компонентів і сервісів на основі .NET можна використовувати будь-який з широкого кола мов. Можна застосовувати C++ з розширенням керованості, З# і VB.NET, створені Microsoft, а також ще багато мов, розроблені іншими компаніями. Але головне навіть не те, що за допомогою всіх цих мов можна створювати додатки на основі .NET, a те, що у всіх питаннях, що належать до ініціалізації об’єктів, викликом методів, наслідування, обробки подій і навіть обробці виключень, робота програми не буде залежати від динаміки реалізації його складових. Це стало можливим завдяки тому, що мови .NET не компілюються на рідну мову, а на загальний проміжний мова Intermediate Language (IL).

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

Програми складаються з коду і даних, і загальномовне середовище виконання CLR забезпечує підтримку і керованим даними, і керованого коду. Як було сказано в попередніх розділах, керовані дані розміщуються в керованій динамічно розподіляється області пам’яті (кучі), яка має дуже цінну особливість — автоматичне складання сміття. Якщо при створенні програм на звичайному C++ програміст повинен сам створювати засоби управління динамічно розподіляється областю пам’яті, то загальномовне середовище виконання CLR реалізує цей процес, відстежуючи посилання на об’єкти і автоматично звільняючи ресурси, зайняті об’єктами, які стали недоступні програмі.

Використовуючи C++ з розширеннями керованості, можна створювати керовані код і дані. Проте в даний час C++ є єдиним з усіх мов .NET, з допомогою якого можна створювати також і некеровані код і дані. Фактично, керовані і некеровані код і дані C++ можуть бути визначені в одному і тому ж вихідному файлі, і в деякій мірі ці два світи можуть взаємодіяти. Хоча використання керованих коду і даних має багато переваг, воно може привести до зниження продуктивності і втрати гнучкості. Тому в багатьох випадках C++ виявляється найкращим вибором для створення програм. Іншою причиною вибору з усіх мов .NET саме C++ може бути бажання вдосконалювати ваше знання C++ та існуючі напрацювання на цій мові.

Використання розширень керованого C++

При розробці керованого коду на Visual C++ використовуються кілька нових ключових слів, а розширення компілятор C++, яка дозволяє створювати додатки для .NET, викликається за допомогою параметра /CLR (Компіляція для виконання у загальномовний середовищі). Цей параметр вказує компілятору, що в кінцевому файлі слід застосовувати набір інструкцій проміжного мови IL, а не звичайний набір інструкцій процесора. Нові ключові слова використовуються при створенні керованого коду і не підтримуються при створенні звичайного некерованого коду. Хоча наявність або відсутність параметра /CLR (Компіляція для виконання у загальномовний середовищі) повністю визначає, чи компілятор генерувати керований (на проміжному мовою IL) або некерований код, можна задавати режим компіляції для окремих частин програми. Це здійснюється з допомогою прагм #pragma:

#pragma managed

// Наступний код компілюється як керований

ttpragma unmanaged

// Наступний код компілюється як некерований

Якщо вибрано параметр компілятора /CLR (Компіляція для виконання в загальномовне середовище), то при відсутності директив #pragma вихідний код за замовчуванням компілюється як керований. При відсутності параметра /CLR (Компіляція для виконання у загальномовний середовищі) прагми #pragma ігноруються компілятором, а код компілюється як некерований.

Для використання можливостей розширення керованості у вихідний файл потрібно вставити директиву fusing із зазначенням збірки (assembly) mscorlib.dll, що містить необхідну для роботи керованого коду інформацію про типах. Такі збірки є розширенням для платформи .NET і зазвичай складаються з файлів DLL (або ЕХЕ). Крім того, майже завжди визначається, що буде використано простір імен System (Системне простір імен); це, однак, не обов’язково для застосування керованого коду. Концепцію просторів імен в C++ прямо копіює концепцію просторів імен багатомовною платформи .NET, що представляє собою ієрархію імен. Ці два аспекти розробки коду для .NET обумовлюють необхідність включення в початок файлу наступних двох рядків:

fusing

// Потрібно для керованого коду на C++

using namespace System;

// використовується простір імен Система

// Не потрібно, але зазвичай використовується

Директива препроцесора fusing схожа на директиву #import в колишніх версіях Visual C++ тим, що робить доступною для компілятора інформацію про типах. У разі директиви #import інформація про типи містилася в бібліотеках типів, зазвичай були файлами TLB, DLL, OCX або ЕХЕ. У разі директиви #using інформація про типи представлена у формі метаданих, що містяться в збірці .NET. Збірка mscorlib.dll містить інформацію про типи, необхідну всім додаткам .NET, включаючи інформацію про базовому класі, який є предком всіх керованих класів, — класі System. 0bject (Система: Об’єкт). Зауважимо, що в такий запису System (Системне простір імен) позначає простір імен, a Object (Об’єкт) — ім’я кореневого класу ієрархії керованих типів.

Ваша перша програма на керованому C++.NET

Хоча ви, майже напевно, добре знайомі з C++, ми почнемо з розгляду дуже простого, але традиційного приклад— програми HelloWorld (Привіт, світ). У цьому розділі ми розповімо, як написати, скомпілювати і запустити цю та інші програми.

Програма HelloWorld (Привіт, світ)

Трохи нижче наведено приклад коду з дуже простої керованої програми, яка виводить на консоль одну-єдину рядок. Ви можете відкрити супроводжує рішення [Як і для всіх інших прикладів в даній книзі, реалізація програми HelloWorld доступна читачеві в готовому вигляді. Вихідні файли цього проет знаходяться в папці C:OINetCppChap3HelloWorld. Для того щоб відкрити його в Visual Studio, двічі клацніть на файлі HelloWorld.sIn в Провіднику.] або створити свій проект і ввести текст програми самостійно. Для того щоб це зробити, необхідно створити порожній проект HelloWorld (Привіт, світ), додати вихідний код, а потім скомпілювати і запустити проект.

Як створити консольний додаток на керованому C++

Створіть порожній проект консольного додатка Managed C++, називається HelloWorld (Привіт, світ):

  1. Відкрити Visual Studio.NET. Виберіть пункт меню File => New => Project (Файл = > Створити => Проект) для того, щоб відкрити діалог New Project (Створення проекту).
  2. Виберіть пункт Visual C++ Projects (Проекти Visual C++) у списку Project Types (Типи проектів).
  3. Виберіть пункт Managed C++ Empty Project (Порожній проект на керованому C++) у списку Templates (Шаблони).
  4. Введіть HelloWorld (Привіт, світ) в якості назви проекту.
  5. Виберіть папку, в якій буде зберігатися проект.
  6. Натисніть OK для того щоб закрити діалог New Project (Створення проекту) і завершити створення нового проекту. Додайте вихідний код:
  7. Клацніть правою кнопкою на папці Source Files (Вихідні файли) у вікні Solution Explorer (Пошук рішень).Виберіть пункт меню Add => Add New Item (Додати => Додати новий елемент) для того, щоб відкрити діалог Add New Item dialog (Додати новий елемент).
  8. Виберіть у списку Templates (Шаблони) пункт C++ File (Файл C++).
  9. Виберіть HelloWorld (Привіт, світ) в якості назви проекту.
  10. Не змінюйте розташування (Location), прийняте за умовчанням.
  11. Клацніть на кнопці Open (Відкрити) для того, щоб закрити діалог Add New Item dialog (Додати новий елемент) і відкрити Source Editor (Редактор текстів програм).
  12. Введіть код прикладу HelloWorld (Привіт, світ). Скомпілюйте і запустіть проект:
  13. Виберіть пункт меню Build => Build (Створити => Створити).
  14. натисніть сполучення клавіш Ctrl-F5 для запуску програми без відладчика.

Директива fusing необхідна для всіх програм на керованому З^+. Вона робить доступними для компілятора стандартні типи (такі, як Console (Консоль) і Object (Об’єкт)), визначені в бібліотеці класів NET. Клас Console (Консоль) знаходиться в просторі імен System (Системне простір імен) та його повне ім’я — System. Console (Система: Консоль) Цей клас містить метод WnteLine, що виводить на консоль текст і додає до нього символ нового рядка.

//HelloWorld.cpp

fusing // потрібно для коду на керованому Ст+

void main(void) <

System. Console. WriteLme ( «Hello Wcrla’M ;

// («Привіт, світ»); >

Програма може бути скомпільована або в Visual Studio.NET, або за допомогою командного рядка з параметром /CLR (Common Language Runtime compilation — компіляція для виконання у загальномовний середовищі). Якщо ви використовуєте командний рядок. ви повинні визначити відповідну середу Найпростіший спосіб зробити це — відкрити командне вікно, вибираючи пункти меню Start (Пуск) => Programs (Програми) => Microsoft Visual Studio.NET 7.0 => Visual Studio.NET Tools => Visual Studio.NET Command Prompt. У командному рядку

cl /CLR HelioWorld.cpp

вихідний файл компілюється, а потім автоматично компонується так, що результатом є ЕХЕ-файл HelloWorld.exe. Пізніше ми розповімо, як створити керовану динамічно підключається бібліотеку (DLL).

Отриману керовану програму можна запустити в Visual Studio.NET або

Директива #using і оператор using

Директива fusing робить доступною для компілятора інформацію про типи, що міститься в збірці. Збірка містить метадані (опис інформації про типи) та код на проміжному мовою IL. C6opKamscorlib.dll містить описи багатьох корисних стандартних класів, визначених у .NET Framework, в тому числі класу Console (Консоль), що використовувався в попередньому прикладі, і класу Object (Об’єкт), який є базовим для всіх керованих класів. Додамо, що директива #us_ng зовсім не схожа на директиву #include, вставляющую в компільований файл деякий інший вихідний файл. Як зазначено вище, директива fusing швидше нагадує по чиненим діям директиву # import.

У попередньому прикладі System (Системне простір імен) предсташшет простір імен C++, прямо відповідне простору імен .NET, що має ту ж назву. Повна назва класу складається з назви простору імен, за яким слідують два двокрапки і назва класу, наприклад, System. Console (Система: Консоль) Хоча вираз using namespace, у попередньому прикладі не використовується, воно дозволяє використовувати короткі імена класів, наприклад, Console (Консоль). Звернемо вашу увагу на те, що вираз using namespace (визначений стандартом ANSI C++) та директива fusing (визначена Microsoft C++) — абсолютно різні речі. Наведемо приклад використання вираження using namespace, що дозволяє замінити повне ім’я System. Console (Система.:Консоль) укороченим Console (Консоль):

//HelloKorld.cpp

fusing

// використовувати простір імен Система;

Стандартний ввід-висновок

Клас System. Console (Система: Консоль) забезпечує підтримку стандартного вводу-виводу. Метод ReadLine класу System. Console (Система: Консоль) зчитує введену з клавіатури рядок як текстову. За допомогою методів Write (Запис) і WriteLine класу System. Console (Система: Консоль) на консоль виводиться текстова рядок, і, говорячи про метод WriteLine, також символ нового рядка. Найпростіше ввести з консолі виконується шляхом зчитування об’єкт String (Рядок) з подальшим перетворенням в потрібний тип даних. Щоб виконати це перетворення можна використовувати методи ТоХхх класу System. Convert (Система: Перетворення).

Короткий опис статті: програмування на c Architecture Net самовчитель Architecture Net

Джерело:
Програмування на керованому C++

Також ви можете прочитати