- •Введение Обзор .Net. Основные понятия
- •Программа на c#
- •Основы языка Пространство имён
- •Система типов
- •Класс и Структура. Первое приближение
- •Литералы. Представление значений
- •Арифметические литералы
- •Логические литералы
- •Символьные литералы
- •Символьные escape-последовательности
- •Строковые литералы
- •Операции и выражения
- •Приоритет операций
- •Приведение типов
- •Особенности выполнения арифметических операций
- •Особенности арифметики с плавающей точкой
- •Константное выражение
- •Переменные элементарных типов. Объявление и инициализация
- •Константы
- •Перечисления
- •Объявление переменных. Область видимости и время жизни
- •Управляющие операторы
- •Синтаксис объявления метода
- •Вызов метода
- •Перегрузка методов
- •Способы передачи параметров при вызове метода
- •Передача параметров. Ссылка и ссылка на ссылку как параметры
- •Сравнение значений ссылок
- •This в нестатическом методе
- •Свойства
- •Обработка исключений
- •Массив. Объявление
- •Инициализация массивов
- •Примеры инициализации массивов
- •Два типа массивов: Value Type and Reference Type
- •Встроенный сервис по обслуживанию простых массивов
- •Реализация сортировки в массиве стандартными методами
- •Подробнее о массивах массивов (jagged array)
- •Массивы как параметры
- •Спецификатор params
- •Main в классе. Точка входа
- •Создание объекта. Конструктор
- •Операция new
- •В управляемой памяти нет ничего, что бы создавалось без конструктора
- •Кто строит конструктор умолчания
- •This в контексте конструктора
- •Перегрузка операций
- •Синтаксис объявления операторной функции
- •Унарные операции. Пример объявления и вызова
- •Бинарные операции
- •Определение операций конъюнкция и дизъюнкции
- •И вот результат…
- •Пример. Свойства и индексаторы
- •Explicit и implicit. Преобразования явные и неявные
- •Наследование
- •Наследование и проблемы доступа
- •Явное обращение к конструктору базового класса
- •Кто строит базовый элемент
- •Переопределение членов базового класса
- •Наследование и new модификатор
- •Полное квалифицированное имя. Примеры использования
- •Прекращение наследования. Sealed спецификатор
- •Абстрактные функции и абстрактные классы
- •Ссылка на объект базового класса
- •Операции is и as
- •Виртуальные функции. Принцип полиморфизма
- •Интерфейсы
- •Делегаты
- •События
- •События и делегаты. Различия
- •Атрибуты, сборки, рефлексия Рефлексия (отражение) типов
- •Реализация отражения. Type, InvokeMember, BindingFlags
- •Атрибуты
- •Сборка. Класс Assembly
- •Класс сборки в действии
- •Разбор полётов
- •Класс System.Activator
- •Версия сборки
- •Файл конфигурации приложения
- •Общедоступная сборка
- •Игры со сборками из gac
- •Динамические сборки
- •Динамическая сборка: создание, сохранение, загрузка, выполнение
- •Ввод-вывод Базовые операции
- •Потоки: байтовые, символьные, двоичные
- •Предопределённые потоки ввода-вывода
- •Функция ToString()
- •Консольный ввод-вывод. Функции-члены класса Console
- •Консольный вывод. Форматирование
- •Функции вывода. Нестандартное (custom) форматирование значений.
- •Консольный ввод. Преобразование значений
- •Файловый ввод-вывод
- •Потоки Процесс, поток, домен
- •Домен приложения
- •Обзор пространства имён System.Threading
- •Многопоточность
- •Виды многопоточности
- •А кто в домене живёт…
- •Класс Thread. Общая характеристика
- •Именование потока
- •Игры с потоками
- •Характеристики точки входа дополнительного потока
- •Запуск вторичных потоков
- •Приостановка выполнения потока
- •Отстранение потока от выполнения
- •Завершение потоков
- •Метод Join()
- •Состояния потока (перечисление ThreadState)
- •Одновременное пребывание потока в различных состояниях
- •Фоновый поток
- •Приоритет потока
- •Передача данных во вторичный поток
- •Извлечение значений (данных) с помощью Callback методов
- •Организация взаимодействия потоков
- •1. Посредством общедоступных (public) данных
- •2. Посредством общедоступных (public) свойств
- •3. Посредством общедоступных очередей
- •Состязание потоков
- •Блокировки и тупики
- •Очереди. Основа интерфейса взаимодействия
- •Безопасность данных и критические секции кода
- •Пример организации многопоточного приложения
- •Очередь как объект синхронизации
- •Синхронизация работы потоков при работе с общими ресурсами
- •1. Организация критических секций
- •2. Специальные возможности мониторов
- •Рекомендации по недопущению блокировок потоков
- •Форма Класс Form
- •Форма: управление и события жизненного цикла
- •Форма: контейнер как элемент управления
- •Разница между элементами управления и компонентами.
- •Свойства элементов управления. Anchor и Dock
- •Extender providers. Провайдеры дополнительных свойств
- •Validating и Validated элементов управления
- •Управление посредством сообщений
- •Стандартный делегат
- •Делегат EventHandler
- •Класс Application
- •События класса Application
- •Примеры перехвата сообщений
- •Метод WndProc
- •Пример переопределения WndProc
- •Контекст приложения
- •Применение классов GraphicsPath и Region. Круглая форма
- •Собственные элементы управления
- •Литература
Динамическая сборка: создание, сохранение, загрузка, выполнение
///-----------------------------------------------------------------------------------
/// Вот такой класс в составе однофайловой сборки DynamicAssm
/// предполагается построить в ходе выполнения сборки DynamicAssemblyGenerator.
///
/// public class DynamicTest
/// {
/// private string messageString;
/// // Конструктор
/// DynamicTest(string strKey)
/// {
/// messageString = strKey;
/// }
///
/// // Методы
/// public void ShowMessageString()
/// {
/// System.Console.WriteLine(“the value of messageString is {0}...”, messageString);
/// }
///
/// public string GetMessageString()
/// {
/// return messageString;
/// }
///
///}
///-----------------------------------------------------------------------------------
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
namespace DynamicAssemblyGenerator
{
/// <summary>
/// AssemblyGenerator - класс, реализующий динамическую генерацию сборки.
/// </summary>
class AssemblyGenerator
{
public string XXX;
public string ZZZ()
{
return XXX;
}
public int CreateAssm(AppDomain currentAppDomain)
{
// Создание сборки начинается с присвоения ей имени и номера версии.
// Для этого используется класс AssemblyName.
// Определяется имя и версия создаваемой сборки.
AssemblyName assmName = new AssemblyName();
assmName.Name = “DynamicAssm”;
assmName.Version = new Version(“1.0.0.0”);
// Создаётся сборка в памяти. В рамках текущего домена приложения.
// С использованием режима доступа, который задаётся одним из элементов перечисления:
// Run - динамическая сборка выполняется, но не сохраняется.
// RunAndSave - динамическая сборка выполняется и сохраняется.
// Save - динамическая сборка не выполненяется, но сохраняется.
AssemblyBuilder assembly = currentAppDomain.DefineDynamicAssembly(assmName,
AssemblyBuilderAccess.Save);
// Создаётся однофайловая сборка, в которой имя единственного модуля совпадает с именем самой сборки.
ModuleBuilder module = assembly.DefineDynamicModule(“DynamicAssm”,
«DynamicAssm.dll» );
// Создаётся и определяется класс DynamicTest класс. Метод module.DefineType позволяет
// встраивать в модуль класс, структуру или интерфейс.
// Вторым параметром метода идёт элемент перечисления. Таким образом создаётся объект-заготовка
// класса, который далее дополняется полями, свойствами, методами...
TypeBuilder dynamicTestClass = module.DefineType(“DynamicAssm.DynamicTest”,
TypeAttributes.Public);
// Объявляется данное-член класса DynamicTest.
// Предполагается объявить “private string messageString;”
FieldBuilder messageStringField = dynamicTestClass.DefineField(“messageString”,
Type.GetType(“System.String”),
FieldAttributes.Private);
// Объекты для генерации элементов класса. В данном конкретном случае используются при генерации:
ILGenerator bodyConstructorIL; // - тела конструктора.
ILGenerator methodIL; // - тела метода.
// Объявляется конструктор.__________________________________________________________
// Предполагается объявить «DynamicTest(string strKey)...»
Type[] constructorArgs = new Type[1];
constructorArgs[0] = Type.GetType(“System.String”);
ConstructorBuilder constructor = dynamicTestClass.DefineConstructor(
MethodAttributes.Public,
CallingConventions.Standard,
constructorArgs);
// Тело конструктора. Представляет собой IL код,
// который встраивается в тело конструктора посредством метода Emit,
// определённого в классе ILGenerator (см. Объекты для генерации элементов класса).
// Метод Emit в качестве параметров использует перечисление OpCodes (коды операций),
// которые определяют допустимые команды IL.
bodyConstructorIL = constructor.GetILGenerator();
bodyConstructorIL.Emit(OpCodes.Ldarg_0);
Type objectClass = Type.GetType(“System.Object”);
ConstructorInfo greatConstructor = objectClass.GetConstructor(new Type[0]);
bodyConstructorIL.Emit(OpCodes.Call, greatConstructor);
bodyConstructorIL.Emit(OpCodes.Ldarg_0);
bodyConstructorIL.Emit(OpCodes.Ldarg_1);
bodyConstructorIL.Emit(OpCodes.Stfld,messageStringField);
bodyConstructorIL.Emit(OpCodes.Ret);
// Конец объявления конструктора.____________________________________________________
// Объявление метода public string GetMessageString()________________________________
MethodBuilder GetMessageStringMethod = dynamicTestClass.DefineMethod(
“GetMessageString”,
MethodAttributes.Public,
Type.GetType(“System.Sring”),
null);
// IL_0000: ldarg.0
// IL_0001: ldfld string DynamicAssemblyGenerator.AssemblyGenerator::XXX
// IL_0006: stloc.0
// IL_0007: br.s IL_0009
// IL_0009: ldloc.0
// IL_000a: ret
//System.Reflection.Emit.Label label = new Label();
// Тело метода...
methodIL = GetMessageStringMethod.GetILGenerator();
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Ldfld,messageStringField);
methodIL.Emit(OpCodes.Ret);
// Конец объявления метода public string GetMessageString()___________________________
// Объявление метода public string ShowMessageString()________________________________
MethodBuilder ShowMessageStringMethod = dynamicTestClass.DefineMethod(
“ShowMessageString”,
MethodAttributes.Public,
null,
null);
// Тело метода...
methodIL = ShowMessageStringMethod.GetILGenerator();
methodIL.EmitWriteLine(“This is ShowMessageStringMethod...”);
methodIL.Emit(OpCodes.Ret);
// Конец объявления метода public string ShowMessageString()__________________________
// Вот и завершили динамическое объявление класса.
dynamicTestClass.CreateType();
// Остаётся его сохранить на диск.
assembly.Save(“DynamicAssm.dll”);
return 0;
}
static void Main(string[] args)
{
// Создаётся и сохраняется динамическая сборка.
AssemblyGenerator ag = new AssemblyGenerator();
ag.CreateAssm(AppDomain.CurrentDomain);
// Для наглядности! создаются НОВЫЕ объекты и заново добывается
// ссылка на текущий домен приложения.
// Теперь - дело техники. Надо загрузить и выполнить сборку.
// Делали. Умеем!
AppDomain currentAppDomain = Thread.GetDomain();
AssemblyGenerator assmGenerator = new AssemblyGenerator();
assmGenerator.CreateAssm(currentAppDomain);
// Загружаем сборку.
Assembly assm = Assembly.Load(“DynamicAssm”);
// Объект класса Type для класса DynamicTest.
Type t = assm.GetType(“DynamicAssm.DynamicTest”);
// Создаётся объект класса DynamicTest и вызывается конструктор с параметрами.
object[] argsX = new object[1];
argsX[0] = “Yes, yes, yes-s-s-s!”;
object obj = Activator.CreateInstance(t, argsX);
MethodInfo mi;
// «От имени» объекта-представителя класса DynamicTest
// вызывается метод ShowMessageString.
mi = t.GetMethod(“ShowMessageString”);
mi.Invoke(obj,null);
// «От имени» объекта-представителя класса DynamicTest
// вызывается метод GetMessageString.
// Этот метод возвращает строку, которая перехватывается
// и выводится в окне консольного приложения.
mi = t.GetMethod(“GetMessageString”);
//!!!//mi.Invoke(obj,null);//Этот метод не вызывается. Криво объявился? //
}
}
}