- •Сравнительная характеристика технологий .Net и Java.
- •Промежуточный язык il и байт-код Java. Сравнительная характеристика.
- •Основные принципы построения архитектуры .Net.
- •Сборки (assembly) в среде .Net. Проблема версионности сборок и ее решение.
- •Общая система типов данных в среде .Net. Размерные и ссылочные типы данных.
- •Модель автоматической утилизации динамической памяти, основанная на сборке мусора. Проблема недетерминизма.
- •Модель автоматической утилизации динамической памяти, основанная на аппаратной поддержке (тегированной памяти).
- •Сборка мусора в среде .Net. Построение графа достижимых объектов.
- •Сборка мусора в среде .Net. Механизм поколений объектов.
- •Завершение объектов в среде .Net. Метод Finalize. Список завершаемых объектов (finalization queue) и очередь завершения (freachable queue).
- •Динамические массивы в среде. Net и языке c#.
- •События в среде .Net; реализация событий посредством делегатов.
- •Исключительные ситуации и реакция на них в среде .Net.
- •Средства многопоточного программирования в среде .Net. Автономные потоки. Пул потоков.
- •Асинхронные операции в среде .Net. Асинхронный вызов делегатов.
- •Синхронизация программных потоков в среде .Net. Блокировки.
- •Синхронизация программных потоков в среде .Net. Атомарные (Interlocked-) операции.
- •Мониторы в среде .Net. Ожидание выполнения условий с помощью методов Wait и Pulse.
- •Асинхронный вызов делегатов.
- •Итераторы в среде .Net. Создание и использование итераторов.
- •Атрибуты в среде .Net и языке c#. Создание своих атрибутов.
- •Сервисно-ориентированная архитектура (соа) и ее принципы.
- •Технология wcf. Создание сервиса и клиента.
- •Взаимодействие управляемого и неуправляемого кода в среде .Net на примере вызова функций Windows api.
-
Атрибуты в среде .Net и языке c#. Создание своих атрибутов.
Атрибуты предоставляют эффективный метод связывания декларативной информации с кодом C# (типы, методы, свойства и т. д.). Атрибут, связанный с сущностью программы, может быть запрошен во время выполнения с помощью метода, называемого отражением.
Существует две формы атрибутов.
Атрибуты, которые определены в среде CLR.
Пользовательские атрибуты, которые можно создать, чтобы добавить в код дополнительные сведения. Затем эти сведения можно извлечь программным путем.
Атрибуты имеют следующие параметры.
Атрибуты добавляют в программу метаданные. Метаданные представляют собой сведения о типах, определенных в программе. Все сборки .NET содержат заданный набор метаданных, описывающий типы и члены типов, определенных в сборке. Для задания необходимых дополнительных сведений можно добавить атрибуты.
Программа может проверить собственные метаданные или метаданные в других программах с помощью отражения.
Атрибуты, например MarshallAsare, широко используемые в сценариях COM-взаимодействия.
Атрибуты могут быть размещены в большинстве объявлений, хотя определенный атрибут может ограничить типы объявлений, в которых он допустим. Синтаксически атрибут указывается путем размещения его имени, заключенного в квадратные скобки, в начале объявления сущности, к которой он применяется. Например, объявление метода с атрибутом DllImport выглядит следующим образом.
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Многие атрибуты имеют параметры, которые могут быть либо позиционными, неименованными, либо именованными. Именованные параметры следует указывать в определенном порядке, их нельзя опустить; именованные параметры являются необязательными и могут быть указаны в любой последовательности. Сначала указываются позиционные параметры. Например, следующие три атрибута являются эквивалентными.
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
Первый параметр — имя библиотеки DLL — является позиционным и всегда стоит на первом месте; остальные являются именованными. В этом случае оба именованных параметра по умолчанию имеют значение "false" и могут быть пропущены.
В объявлении можно разместить несколько атрибутов — либо по отдельности, либо в одном наборе скобок.
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Можно создать собственные настраиваемые атрибуты, задав класс атрибутов, который явно или косвенно наследует от Attribute, что облегчает и ускоряет определение атрибутов в метаданных. Предположим, что необходимо пометить классы и структуры именем программиста, который создал класс или структуру. Можно задать класс настраиваемых атрибутов Author:
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct)
]
public class Author : System.Attribute
{
private string name;
public double version;
public Author(string name)
{
this.name = name;
version = 1.0;
}
}
В качестве имени класса используется имя атрибута Author. Он является производным от System.Attribute, следовательно, это класс настраиваемых атрибутов. Параметры конструктора являются позиционными параметрами настраиваемого атрибута, тогда name и все открытые для чтения и записи поля или свойства являются именованными параметрами, в этом случае единственным именованным параметром является version. Обратите внимание на то, что атрибут AttributeUsage используется для того, чтобы атрибут Author был действителен только для объявлений class и struct.
-
Получение всех классов и методов в сборке .NET.
Reflection — значительное нововведение в .NET. Через Reflection программы собирают и работают со своими метаданными. Это мощный механиз для изучения assembly и разных объектов во время работы программы. Рассматриваемое API находится в System.Reflection namespace. Через Reflection можно получить информацию о классах, методах, свойствах и событиях любого объекта, а также можно вызывать методы. И т.д.
Использование Reflection для получения списка используемых assembly
using System;
using System.Reflection;
namespace ReflectionDemoCSharp
{
class ReferencedAssemblies
{
[STAThread]
static void Main(string[] args)
{
Assembly[] appAssemblies =
System.AppDomain.CurrentDomain.GetAssemblies ();
foreach (Assembly assembly in appAssemblies )
{
Console.WriteLine (assembly.FullName );
}
Console.ReadLine ();
}
}
}
Класс System.AppDomain class представляет домен приложения, который является некоей изолированной областью, в которой исполняется приложение.
Надо пояснить, что это изолированная область памяти, потоков, процессов и прочего. Для каждого приложения создается свой домен, и все необходимые assembly загружаются в домен каждого приложения. Для общения между доменами есть свои особые механизмы.
Метод GetAssemblies() возвращает список assembly, загруженных в домен ReflectionDemoCSharp.