Вступ до екосистеми .NET
Навіщо нам .NET? Проблема з реального світу
Уявіть, що ви розробник у 2000-му році. Ви хочете створити застосунок, який працюватиме на Windows, виконуватиме складні бізнес-операції, взаємодіятиме з базами даних і забезпечуватиме безпеку даних користувачів. У вас є кілька варіантів:
- C/C++: Надзвичайно швидкий, але складний. Управління пам'яттю вручну — це джерело помилок.
- Visual Basic: Простий, але обмежений у можливостях.
- Java: Кросплатформенний, але не інтегрований з Windows ecosystemою.
Microsoft створила .NET Framework як відповідь на цей виклик. Сьогодні .NET — це потужна, кросплатформенна екосистема для створення будь-яких типів застосунків.
Еволюція .NET: Від Windows-Only до Cross-Platform Giant

Історична хронологія
Три покоління .NET
| Характеристика | .NET Framework | .NET Core | Modern .NET (5+) |
|---|---|---|---|
| Платформи | Windows only | Windows, Linux, macOS | Windows, Linux, macOS, mobile, IoT |
| Open Source | ❌ Ні | ✅ Так | ✅ Так |
| Продуктивність | Базова | Висока | Надзвичайно висока |
| Deployment | System-wide | Side-by-side | Side-by-side + Native AOT |
| Підтримка | До 2029 (.NET Framework 4.8) | Завершено | Активна (LTS: .NET 10) |
| Use Cases | Legacy apps, WinForms, WPF | Modern web, microservices | Усе: web, mobile, desktop, cloud, ML |
Що таке .NET? Фундаментальні концепції
Академічне визначення
.NET Platform.NET (дотнет) — це безкоштовна, кросплатформенна, відкрита (open-source) платформа розробки від Microsoft для створення різноманітних типів застосунків: веб-додатків, мобільних аплікацій, desktop-програм, хмарних сервісів, ігор, IoT-рішень та систем машинного навчання.
Ключові компоненти екосистеми
Runtime (CLR)
Base Class Library (BCL)
Languages
Аналогія з реального світу
Уявіть .NET як універсальну кухню з професійним обладнанням:
- CLR (Runtime) — це кухонна плита та духовка: ви готуєте свою страву (код), а вони забезпечують необхідне тепло (виконання) та контролюють процес.
- BCL (Base Class Library) — це набір інструментів та інгредієнтів: ножі, каструлі, сіль, спеції — усе, що потрібно для базового приготування.
- C#, F# (Languages) — це рецепти різних кухонь: італійська паста (C#), французька випічка (F#) — різні підходи, але всі використовують одну кухню.
- .NET SDK — це кухар-інструктор: допомагає правильно організувати процес та дає поради.
CLR: Серце платформи

Архітектура Common Language Runtime
Що робить CLR?
Завантаження та верифікація
CLR завантажує ваш скомпільований код (IL) та перевіряє його безпеку типів (type safety). Це означає, що неможливо випадково звернутися до пам'яті, на яку ви не маєте права.
JIT-компіляція
Just-In-Time Compiler перетворює IL-код у нативний машинний код безпосередньо під час виконання. Це відбувається один раз для кожного методу при першому виклику.
Управління пам'яттю
Garbage Collector (GC) автоматично відстежує об'єкти в пам'яті та звільняє ті, які більше не використовуються. Ви не пишете free() або delete як у C++.
Обробка помилок
CLR централізовано обробляє виняткові ситуації (exceptions) та забезпечує структурований механізм відновлення.
Безпека виконання
Code Access Security (CAS) та інші механізми контролюють, які операції дозволені вашому коду (доступ до файлів, мережі тощо).
- Автоматичне управління пам'яттю → менше витоків пам'яті (memory leaks)
- Type safety → менше помилок доступу до пам'яті
- Кросплатформенність → один код працює на різних ОС
- Безпека → ізоляція та контроль доступу
IL та JIT: Магія компіляції

Compilation Pipeline: Від C# до Machine Code
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello, .NET!");
}
}
.method public static void Main() cil managed
{
.entrypoint
.maxstack 8
// Load string onto stack
ldstr "Hello, .NET!"
// Call Console.WriteLine
call void [System.Console]System.Console::WriteLine(string)
// Return from method
ret
}
; Simplified representation
mov rcx, offset string_literal
call System.Console.WriteLine
ret
Процес компіляції: Два етапи
Tiered Compilation: Розумна оптимізація
Modern .NET використовує багаторівневу компіляцію (Tiered Compilation):
| Tier | Опис | Переваги | Коли використовується |
|---|---|---|---|
| Tier 0 | Швидка, мінімально оптимізована компіляція | Швидкий старт застосунку | Перший виклик методу |
| Tier 1 | Повна оптимізація з профілюванням | Максимальна продуктивність | Після збору статистики (hot paths) |
RyuJIT: Оптимізація під капотом
RyuJIT — це назва сучасного JIT-компілятора в .NET. Він виконує численні оптимізації:
1. Method Inlining (Вбудовування методів)
Замість виклику маленького методу, JIT вставляє його код безпосередньо у місце виклику, усуваючи overhead виклику функції.
public int Add(int a, int b) => a + b;
public void Calculate()
{
int result = Add(5, 10); // Method call overhead}
public void Calculate()
{
int result = 5 + 10; // No method call, direct calculation}
2. Loop Unrolling (Розгортання циклів)
JIT може розгорнути малі цикли для зменшення кількості перевірок умов і збільшення інструкцій, які CPU може виконати паралельно.
int sum = 0;
for (int i = 0; i < 4; i++)
{
sum += array[i];
}
int sum = 0;
sum += array[0];
sum += array[1];
sum += array[2];
sum += array[3];
// Fewer branch predictions, better CPU pipelining
3. SIMD Vectorization (Векторизація)
RyuJIT автоматично використовує SIMD (Single Instruction, Multiple Data) інструкції процесора для обробки декількох значень одночасно.
// System.Numerics.Vectors example
using System.Numerics;
Span<float> values = stackalloc float[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
Span<float> results = stackalloc float[8];
var vector1 = new Vector<float>(values);
var vector2 = new Vector<float>(2.0f); // All elements = 2.0
var resultVector = vector1 * vector2; // Multiplies 8 floats in ONE CPU instructionresultVector.CopyTo(results);
// Results: [2, 4, 6, 8, 10, 12, 14, 16]
CTS та CLS: Універсальна мова типів
Common Type System (CTS)
CTS — це специфікація, яка визначає, як типи даних описуються та використовуються в .NET. Вона забезпечує сумісність між мовами.
Приклад міжмовної сумісності
// MyLibrary.dll
namespace MathLib
{
public class Calculator
{
public int Add(int a, int b) => a + b;
}
}
// F# can use C# library seamlessly
open MathLib
let calc = Calculator()
let result = calc.Add(10, 20) // Returns 30
printfn "Result: %d" result
Common Language Specification (CLS)
CLS — це підмножина CTS, яка визначає мінімальний набір функцій, які повинен підтримувати будь-який .NET-сумісний компілятор.
Наприклад:
- ❌
public UInt32 GetId()—UInt32не CLS-compliant - ✅
public int GetId()—int(Int32) CLS-compliant
Налаштування середовища розробки
Вибір IDE: Порівняння інструментів

| IDE | Платформа | Ліцензія | Переваги | Недоліки | Рекомендовано для |
|---|---|---|---|---|---|
| Visual Studio | Windows, macOS | Community: Free Pro/Enterprise: Paid | Найпотужніший debugger, інтеграція з Azure, GUI-дизайнери | Важкий, повільний на старих ПК | Enterprise-розробка, WPF, WinForms |
| JetBrains Rider | Win, Mac, Linux | Платна (підписка) | Швидкий, інтелектуальний ReSharper, кросплатформенний | Потребує підписку | Професійна розробка, великі проєкти |
| VS Code + C# Dev Kit | Win, Mac, Linux | Безкоштовна | Легкий, швидкий, розширюваний, великий Marketplace | Менше функцій для складного debugging | Web-розробка, скрипти, легкі проєкти |
Встановлення .NET SDK
Завантаження .NET SDK
Відвідайте офіційний сайт: https://dotnet.microsoft.com/download
Завантажте останню LTS (Long-Term Support) версію — . NET 10.
Установка
winget install Microsoft.DotNet.SDK.10
choco install dotnet-sdk -y
scoop install dotnet-sdk
brew install --cask dotnet-sdk
sudo apt-get update
sudo apt-get install -y dotnet-sdk-10.0
Перевірка встановлення
Відкрийте термінал та виконайте:
dotnet --version
Очікуваний вивід:
10.0.100
.NET CLI: Mastering Command Line Interface
Основні команди: Швидкий довідник
| Команда | Опис | Приклад |
|---|---|---|
dotnet new | Створює новий проєкт з шаблону | dotnet new console -n MyApp |
dotnet build | Компілює проєкт | dotnet build |
dotnet run | Компілює та запускає проєкт | dotnet run |
dotnet watch | Автоматично перекомпілює при змінах | dotnet watch run |
dotnet publish | Публікує застосунок для deployment | dotnet publish -c Release |
dotnet add package | Додає NuGet-пакет | dotnet add package Newtonsoft.Json |
dotnet restore | Відновлює залежності | dotnet restore |
dotnet test | Запускає тести | dotnet test |
Workflow: Створення першого застосунку
Створення проєкту
dotnet new console -n HelloDotNet
cd HelloDotNet
Ця команда створює консольний застосунок з назвою HelloDotNet.
Структура проєкту
Перегляд коду
// Top-level statements (C# 9+)
Console.WriteLine("Hello, World!");
Запуск застосунку
dotnet run
Вивід:
Hello, World!
Watch mode (автоматична перекомпіляція)
dotnet watch run
Тепер змініть Program.cs:
Console.WriteLine("Hello, .NET! 🚀");
Збережіть файл — застосунок автоматично перезапуститься!
Публікація для production
dotnet publish -c Release -r win-x64 --self-contained
Пояснення:
-c Release→ Оптимізована збірка (Release mode)-r win-x64→ Runtime Identifier (Windows 64-bit)--self-contained→ Включає .NET runtime у пакет (не потребує встановленого .NET на цільовій машині)
dotnet watch під час розробки — це заощаджує величезну кількість часу, автоматично перекомпілюючи код при кожній зміні..NET 10: Сучасні можливості
Modern .NET еволюціонує з неймовірною швидкістю. Ось найважливіші інновації останніх версій:
.NET 10 (LTS - Листопад 2025)
Long-Term Support до 2028| Функція | Опис | Переваги |
|---|---|---|
| Discriminated Unions | Нативна підтримка union types (як у F#) | Безпечніша робота з варіантами типів |
| Primary Constructors Enhanced | Розширення на всі типи класів | Менше boilerplate коду |
| Performance Improvements | SIMD, PGO за замовчуванням, оптимізації GC та компілятора | До 40% швидше у веб-сценаріях порівняно з .NET 8 |
| Native AOT Maturity | Покращена підтримка Ahead-of-Time компіляції | Startup за <1ms, менший розмір (~10MB standalone apps) |
| JSON Source Generators v3 | Нове покоління source generators для System.Text.Json | Найшвидша серіалізація, zero-allocation |
| Blazor Enhancements | WebAssembly preloading, form validation improvements | Кращий UX для веб-застосунків |
Порівняння останніх версій
| Версія | Тип підтримки | Підтримка до | Ключові особливості |
|---|---|---|---|
| .NET 8 | LTS | Листопад 2026 | Blazor SSR, TimeProvider, Native AOT improvements |
| .NET 9 | STS | Травень 2026 | Hybrid Cache, LINQ improvements (CountBy, AggregateBy), OpenAI SDK |
| .NET 10 | LTS | Листопад 2028 | Discriminated Unions, Performance boost, Enhanced Primary Constructors |
IL Analysis & Protection: Reflectors та Obfuscators
Що таке Reflectors (Дизасемблери)?
Reflector (Decompiler) — це інструмент, який перетворює скомпільований .NET код (IL) назад у читабельний C#/F# код. Оскільки IL містить багато метаданих (назви класів, методів, змінних), декомпіляція є дуже точною.
Популярні Reflectors
| Інструмент | Тип | Можливості | Use Cases |
|---|---|---|---|
| ILSpy | Open-source | Decompiler, Assembly Browser, Find References | Вивчення чужих бібліотек, reverse engineering |
| dnSpy | Open-source | Decompiler + Debugger + IL Editor | Налагодження сторонніх DLL, патчінг |
| dotPeek | Free (JetBrains) | Decompiler, Navigation, Export to Project | Дослідження коду, інтеграція з Rider |
| ILDasm | Official (Microsoft) | IL Viewer (не C#) | Перегляд raw IL коду |
Приклад: Decompiling з ILSpy
Компілюємо простий застосунок
namespace MyApp;
public class Calculator
{
private const string SecretKey = "MyPassword123";
public int Multiply(int a, int b)
{
return a * b;
}
}
dotnet build -c Release
Відкриваємо DLL у ILSpy
- Завантажте ILSpy: https://github.com/icsharpcode/ILSpy
- Відкрийте
bin/Release/net10.0/MyApp.dll - ILSpy показує оригінальний C# код, включаючи константу
SecretKey!

Obfuscators (Обфускатори): Захист коду
Obfuscator — це інструмент, який перетворює IL-код, роблячи його важким для читання та аналізу, але зберігаючи функціональність.
Методи обфускації
| Техніка | Опис | Приклад |
|---|---|---|
| Name Obfuscation | Заміна зрозумілих назв на випадкові | Calculator → A, Multiply → a1b2 |
| Control Flow Obfuscation | Ускладнення логіки (додавання мертвого коду, заплутування if) | if (true) → if (a ^ b == c) |
| String Encryption | Шифрування рядкових літералів | "MyPassword" → зашифрована послідовність |
| Anti-Tampering | Виявлення модифікацій коду | Перевірка checksum при старті |
| Anti-Debugging | Виявлення debugger | Debugger.IsAttached → Exit |
Популярні Obfuscators
| Інструмент | Тип | Рівень захисту | Вартість |
|---|---|---|---|
| Dotfuscator | Commercial (Microsoft) | Високий (Enterprise: anti-tamper, watermarking) | Free (Community), Paid (Pro/Enterprise) |
| ConfuserEx | Open-source | Середній (name, control flow, constants) | Безкоштовно |
| SmartAssembly | Commercial (Red Gate) | Високий (feature merging, pruning) | Платний |
| .NET Reactor | Commercial | Високий (native code wrapping) | Платний |
Приклад обфускації
public class Calculator
{
public int Multiply(int a, int b)
{
return a * b;
}
}
public class A
{
public int a(int b, int c)
{
int d = b;
int e = c;
return d * e;
}
}
- Не є абсолютним захистом (досвідчений reverse engineer може частково відновити логіку)
- Може погіршити performance (особливо control flow obfuscation)
- Ускладнює debugging production issues (stack traces стають нечитабельними)
Коли використовувати Reflectors та Obfuscators?
✅ Використовуйте Reflectors
- Вивчення внутрішніх механізмів .NET/сторонніх бібліотек
- Debugging проблем у залежностях
- Reverse engineering legacy code без вихідників
- Навчання (розуміння, як реалізовані LINQ, async/await)
🔒 Використовуйте Obfuscators
- Комерційні desktop-застосунки (захист інтелектуальної власності)
- Ліцензійні алгоритми (криптографія, ML-моделі)
- Запобігання крадіжці API-ключів
- Ускладнення створення піратських копій
Перевірка знань
Закріпіть отримані знання, пройшовши короткий тест:
Резюме та Практичні завдання
Що ми дізналися
Історія .NET
CLR Architecture
JIT Optimizations
CTS/CLS
.NET CLI
Modern Features
IL Tools
Практичні завдання
Beginner: Перший .NET застосунок
- Створіть консольний проєкт:
dotnet new console -n MyCalculator - Реалізуйте клас
Calculatorз методамиAdd,Subtract,Multiply,Divide. - Викличте методи з
Mainта виведіть результати. - Опублікуйте застосунок у режимі
Release:dotnet publish -c Release
Intermediate: IL Analysis
- Компілюйте ваш
Calculatorу Release mode. - Завантажте ILSpy та відкрийте скомпільовану DLL.
- Знайдіть метод
Addта подивіться IL код. - Порівняйте IL-код для
DebugvsReleaseзбірок (Release оптимізованіший).
Advanced: Obfuscation Experiment
- Завантажте ConfuserEx: https://github.com/mkaring/ConfuserEx
- Обфускуйте вашу DLL:
- Увімкніть Name Obfuscation
- Увімкніть Control Flow Obfuscation
- Відкрийте обфусковану DLL у ILSpy.
- Зверніть увагу, наскільки важче читати код.
C# Roadmap
Ласкаво просимо до курсу по C#.
Структура програми на C#
Розуміння структури програм на C# є фундаментальним для ефективної розробки. Ця тема охоплює еволюцію від класичного підходу до сучасних [top-level statements](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/program-structure/top-level-statements), а також механізми документування коду.