Visual Studio 2008. Краткий обзор ключевых новинок

Часть 3. Основные изменения в .NET Framework 3.5

Алексей Федоров

Новинки в базовой библиотеке классов

Расширения в System.Diagnostics

Расширения в System.Security.Cryptography

Поддержка каналов

Коммуникации Peer-to-Peer

Механизмы расширений

 

Новая версия библиотеки классов — .NET Framework 3.5 — является продолжением линейки .NET Framework и содержит функциональность предыдущих версий. Библиотека классов .NET Framework 3.5 включает .NET Framework 3.0 SP1, которая, в свою очередь, включает .NET Framework 2.0 SP1 (рис. 1). Такая комбинация различных версий библиотек классов является основой для поддержки написания кода для нескольких версий .NET Framework (multi-targeting), которая впервые появилась в Visual Studio 2008. Что касается установки библиотеки классов, то достаточно установить .NET Framework 3.5, а пакет установки сам установит версии 2.0 и 3.0.

 

Рисунок

Рис. 1. Состав .NET Framework 3.5

В табл. 1 показаны основные версии .NET Framework с момента ее появления в 2002 году.

Кратко напомним основные моменты, связанные с развитием .NET Framework:

  • 2001 — .NET Framework 1.0 и Visual Studio .NET;
  • 2003 — .NET Framework 1.1 и Visual Studio 2003;
  • 2005 — .NET Framework 2.0 и Visual Studio 2005 (вместе с выходом SQL Server 2005);
  • ноябрь 2006 — .NET Framework 3.0 (WCF, WPF, WF, CardSpace), а также расширения для Visual Studio, поддерживающие новые технологии в .NET 3.0;
  • декабрь 2006 — официальный выпуск ASP .NET AJAX 1.0;
  • ноябрь 2007 — .NET Framework 3.5 и Visual Studio 2008;
  • весна 2008 — обновления для поддержки SQL Server 2008.

Этапы развития .NET Framework (за исключением самых ранних версий) показаны также на рис. 2.

 

Рисунок

Рис. 2. Этапы развития .NET Framework

При разработке новой версии .NET Framework была предпринята попытка внесения минимальных изменений в существующие библиотеки. Практически все новинки были реализованы в новых библиотеках классов (в новых динамически загружаемых библиотеках), а новинки на уровне базовой библиотеки классов — в новых классах. Далее перечислены новые сборки, появившиеся в .NET Framework 3.5:

  • System.DirectoryServices.AccountManagement.dll — набор управляемых программных интерфейсов для работы с пользователями, группами и т.п.; базируется на интерфейсах SDS/ADSI и поддерживает как Active Directory, так и Active Directory Application Mode (ADAM, в Windows Server 2008 называется Active Directory Lightweight Directory Services);
  • System.Management.Instrumentation.dll — расширения провайдера WMI .NET с улучшенной масштабируемостью при работе с большими коллекциями WMI-данных;
  • System.Web.Extensions.dll — поддержка расширений для web-приложений, в том числе ASP .NET AJAX, Client Application Services и ASP.NET 3.5 Controls;
  • System.Net.dll — сетевые коммуникации, включая поддержку Peer-To-Peer;
  • System.WorkflowServices.dll — поддержка интеграции Windows Communication Foundation и Windows Workflow Foundation;
  • System.ServiceModel.Web.dll — поддержка протокола HTTP для web-приложений;
  • System.Data.Linq.dll, System.Xml.Linq.dll — поддержка технологий LINQ to SQL и LINQ to XML;
  • System.Data.DataSetExtensions.dll поддержка технологии LINQ to DataSet;
  • System.AddIn.dll, System.AddIn.Contract.dll — поддержка механизмов расширения;
  • System.Core.dll — расширения в базовой библиотеке классов: потоки, безопасность, TimeZone, диагностика, коллекции, WMI, LINQ и т.д.

Теперь рассмотрим новинки, появившиеся в базовой библиотеке классов (Base Class Library, BCL). Об остальных изменениях и дополнениях речь пойдет в соответствующих разделах, посвященных созданию Windows- и web-приложений, сервисов и т.д.

Новинки в базовой библиотеке классов

Начинаем с расширений для работы с датой и временем.

Для поддержки временной зоны в .NET Framework 3.5 включены два новых типа данных:

  • TimeZoneInfo — расширенная поддержка временной зоны, включая перечисление существующих зон, преобразование и сериализацию;
  • DateTimeOffset — тип данных DateTime с поддержкой смещения относительно универсального времени (Coordinated Universal Time, UTC).
  • Рассмотрим несколько примеров, поясняющих применение DateTimeOffset. Создание новой структуры DateTimeOffset возможно одним из приведенных далее способов:
  • DateTimeOffset now = DateTimeOffset.Now;
  • DateTimeOffset now2 = DateTime.Now;
  • DateTimeOffset now3 = new DateTimeOffset(DateTime.Now);
  • DateTime tvShowPremiere = new DateTime(2007, 6, 13, 8, 0, 0);
  • DateTimeOffset tvShowPremiereUTC = new DateTimeOffset(tvShowPremiere.ToUniversalTime());
  • DateTimeOffset tvShowPremiereLA = new DateTimeOffset(tvShowPremiere, new TimeSpan(-7, 0, 0));
  • DateTimeOffset tvShowPremiereNYC =
  • new DateTimeOffset(tvShowPremiere, new TimeSpan(-4, 0, 0));
  • DateTimeOffset tvShowPremiereLocal = tvShowPremiere;
  • DateTimeOffset utcNewYear07 =
  • new DateTimeOffset(2007, 1, 1, 0, 0, 0,
  • new TimeSpan(0, 0, 0));
  • DateTimeOffset seattleNewYear07 =
  • new DateTimeOffset(2007, 1, 1, 0, 0, 0,
  • new TimeSpan(-8, 0, 0));

Для преобразования DateTimeOffset в DateTime можно использовать один из следующих способов:

  • DateTime dtSeatleNewYear07Utc = seattleNewYear07.UtcDateTime;
  • DateTime dtSeattleNewYear07Local = seattleNewYear07.LocalDateTime;

а для обработки DateTimeOffset — один из приведенных далее способов:

  • DateTimeOffset dateA =
  • DateTimeOffset.Parse(«4/15/2006 6:00 AM -7:00»);
  • DateTimeOffset dateB =
  • DateTimeOffset.Parse(«4/15/2006 6:00:00 AM -7:00»);
  • DateTimeOffset dateC =
  • DateTimeOffset.Parse(“-7:00 4/15/2006 6:00 AM”);
  • DateTimeOffset dateD =
  • DateTimeOffset.Parse(“4/15/2006 -7:00 6:00 AM”);

С появлением новых типов данных, связанных с датой и временем, может возникнуть вопрос: когда следует применять DateTime, а когда — DateTimeOffset? Основные рекомендации по выбору типа данных следующие:

  • применяйте DateTimeOffset в тех случаях, когда вы описываете точное время, например при вычислении значения «сейчас», времени изменения файлов, времени возникновения события и т.п. Если текущая временная зона неизвестна, применяйте UTC;
  • используйте DateTime в тех сценариях, когда абсолютная величина времени неважна и некритична временная зона, например для хранения времени открытия и закрытия магазина;
  • применяйте DateTime для сценариев взаимодействия с другими системами и обмена данными в тех случаях, когда информация состоит из даты и времени, но не содержит данных о временной зоне — передача через OLE Automation, базы данных, существующие в .NET программные интерфейсы, которые используют тип данных DateTime, и т.д.;
  • используйте DateTime с компонентом времени в виде 00:00:00 для представления дат;
  • применяйте TimeSpan для представления времени без использования даты.

Как видно из приведенных рекомендаций, тип данных DateTimeOffset предлагается использовать во всех типовых сценариях работы с датой и временем. В новых программных интерфейсах базовой библиотеки классов планируется применение именного такого типа данных. Это не означает, что тип данных DateTimeOffset пришел на смену типу данных DateTimeOffset — последний должен использоваться в описанных выше сценариях.

Тип данных TimeZoneInfo применяется для хранения информации о временной зоне. Вот пример использования данного типа для извлечения информации о временных зонах, хранящейся на локальном компьютере:

using System;

public class TimeZoneInfoSample

{

private static void Main()

{

String id = «Alaskan Standard Time»;

TimeZoneInfo tzi;

try

{

tzi = TimeZoneInfo.FindSystemTimeZoneById(id);

}

catch (TimeZoneNotFoundException e)

{

Console.WriteLine(id + « not found on the local computer: « + e);

return;

}

catch (InvalidTimeZoneException e)

{

Console.WriteLine(id + « is corrupt on the local computer: « + e);

return;

}

Console.WriteLine(«TimeZoneInfo.Id = « + tzi.Id);

Console.WriteLine(«TimeZoneInfo.DisplayName = « + tzi.DisplayName);

Console.WriteLine(«TimeZoneInfo.StandardName = « + tzi.StandardName);

Console.WriteLine(«TimeZoneInfo.DaylightName = « + tzi.DaylightName);

Console.WriteLine(«TimeZoneInfo.BaseUtcOffset = « + tzi.BaseUtcOffset);

Console.WriteLine(«TimeZoneInfo.SupportsDaylightSavingTime = « +

tzi.SupportsDaylightSavingTime);

}

}

Следующая новинка — тип HashSet<T>, реализованный в пространстве имен System.Collections.Generic.HashSet. Данный тип представляет собой неупорядоченную коллекцию уникальных элементов и, помимо стандартных операций типа Add, Remove, Contains, поддерживает такие операции, как объединение, пересечение и поиск симметричных отличий. Посмотрите следующие примеры, показывающие использование этого типа данных:

HashSet<int> theSet1 = new HashSet<int>();

theSet1.Add(1);

theSet1.Add(2);

theSet1.Add(2);

// в theSet1 теперь находятся 1,2

HashSet<int> theSet2 = new HashSet<int>();

theSet2.Add(1);

theSet2.Add(3);

theSet2.Add(4);

// в theSet2 теперь находятся 1,3,4

theSet1.UnionWith(theSet2);

// в theSet1 теперь находятся 1,2,3,4

Операция Add() по умолчанию возвращает значение типа bool, позволяющее узнать, был ли добавлен в коллекцию данный элемент. Таким образом, в примерах, приведенных выше, мы можем проверить, присутствовал ли в коллекции добавляемый элемент:

  • bool added = theSet1.Add(2); // Значение added равно true
  • added = theSet1.Add(2); // Значение added равно false

Обратим внимание на уникальность элементов: HashSet определяет равность элементов с помощью метода EqualityComparer(), который вы можете предоставить, или метода EqualityComparer(), применяемого по умолчанию для того или иного типа данных. В приведенном выше примере мы не указали метод EqualityComparer() — это означает, что будет использоваться метод по умолчанию для сравнения данных типа Int32. В следующем примере мы будем применять метод OddEvenComparer(), который считает элементы равными, если они либо оба четные, либо оба нечетные:

class OddEvenComparer : IEqualityComparer<int> {

public OddEvenComparer() {}

public bool Equals(int x, int y) {

return (x & 1) == (y & 1);

}

public int GetHashCode(int x) {

return (x & 1);

}

}

// Как использовать новый метод сравнения

HashSet<int> oddEvenSet = new HashSet<int>(new OddEvenComparer());

oddEvenSet.Add(1);

oddEvenSet.Add(3);

oddEvenSet.Add(4);

// oddEventSet содержит 1,4; 1 и 3 расцениваются как равные значения

Обратим внимание на метод UnionWith в первом примере. Этот метод, как и другие операторы для работы с наборами данных, модифицирует набор данных, для которого он вызывается, а не создает новый набор. Это важно, так как в технологии LINQ операции типа Union, Intersect и т.п. над интерфейсом IEnumerable создают новый набор данных. Таким образом, методы HashSet не дублируют аналогичные методы LINQ — они предоставляются для использования в тех случаях, когда не требуется создание нового набора данных и в названиях этих методов всегда присутствует ключевое слово With.

Расширения в System.Diagnostics

В пространстве имен System.Diagnostics появилось два новых класса: EventSchemaTraceListener, который служит для перенаправления отладочной или трассировочной информации в файл протокола с сохранением данных в формате XML в соответствии с заданной схемой, и Eventing.EventProviderTraceListener, представляющий собой парный класс для класса System.Diagnostics.TraceSource с возможностью записи данных в строку, разделенную заданным символом разделителя, а также ряд расширений класса Eventing.Reader и PerfomanceData. Последний поддерживается только в Windows Vista и Windows Server 2008 и представляет собой реализацию ряда программных интерфейсов библиотеки advapi32.dll на управляемом коде.

Расширения в System.Security.Cryptography

Пространство имен System.Security.Cryptography пополнилось поддержкой ряда алгоритмов, включая Advanced Encryption Standard (AES) на уровне базового класса, от которого должны наследовать классы, реализующие данный стандарт. Помимо этого реализована поддержка алгоритмов Elliptic Curve Diffie Hellman и Elliptic Curve Digital Signature Algorithm. Кроме того, в пространстве имен System.Security.Cryptography появился ряд новых Hash-алгоритмов. Поддерживаемые алгоритмы приведены в табл. 2.

В табл. 3 и табл. 4 показаны поддерживаемые в пространстве имен System.Security.Cryptography алгоритмы симметричного и асимметричного шифрования.

Поддержка каналов

Новое пространство имен System.IO.Pipes содержит классы, предназначенные для реализации синхронных и асинхронных коммуникаций между процессами через именованные и анонимные каналы (pipe). В данном пространстве имен реализованы классы, представленные в табл. 5.

Как мы видим, в .NET Framework 3.5 входит поддержка применения каналов из приложений, написанных на управляемом коде. Каналы используются для организации коммуникаций между процессами, выполняющимися на одной машине, или процессами, выполняющимися на различных Windows-машинах, объединенных в локальную сеть. Обеспечивается поддержка как анонимных, так и именованных каналов. Новые типы данных, связанных с поддержкой каналов, реализованы в библиотеке System.Core.dll в пространстве имен System.IO.Pipes.

Анонимные каналы служат для полудуплексного обмена текстовой информацией и не поддерживают работу в сети — только в рамках одного экземпляра сервера. Такие каналы чаще всего применяются для обмена сообщениями между потоками или между родительскими и дочерними процессами — в том случае, когда ссылка на канал может быть передана дочернему процессу при его создании.

В следующем примере показано, как передать текстовое сообщение от родительского процесса дочернему. Родительский процесс считывает строку из консоли и передает ее дочернему процессу. Дочерний процесс выводит полученную от родительского процесса строку на экран:

// Родительский процесс

Process process = new Process();

process.StartInfo.FileName = «child.exe»;

using (AnonymousPipeServerStream pipeStream =

new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable))

{

process.StartInfo.Arguments = pipeStream.GetClientHandleAsString();

process.StartInfo.UseShellExecute = false;

process.Start();

pipeStream.DisposeLocalCopyOfClientHandle();

using (StreamWriter sw = new StreamWriter(pipeStream)) {

sw.AutoFlush = true;

sw.WriteLine(Console.ReadLine());

}

}

process.WaitForExit();

process.Close();

// Дочерний процесс

using (StreamReader sr = new StreamReader(

new AnonymousPipeClientStream(PipeDirection.In, args[0]))) {

string line;

while ((line = sr.ReadLine()) != null) {

Console.WriteLine(“Echo: {0}”, line);

}

}

По сравнению с анонимными каналами, именованные каналы обладают более широким набором свойств. Они поддерживают дуплексный обмен информацией, работу в сети и могут использовать несколько экземпляров сервера. Более того, именованные каналы поддерживают передачу сообщений переменной длины и механизмы имперсонации, позволяющие подсоединяющимся процессам применять собственные наборы прав на удаленных серверах.

В тех случаях, когда второй процесс не может унаследовать ссылку на канал, используются именованные каналы. В следующем примере показано, как пересылаются строки от клиентского процесса серверному:

// Серверный процесс

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(«testpipe»))

{

pipeStream.WaitForConnection();

using (StreamReader sr = new StreamReader(pipeStream))

{

string temp;

while ((temp = sr.ReadLine()) != null)

{

Console.WriteLine(«{0}: {1}», DateTime.Now, temp);

}

}

}

// Клиентский процесс

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(«testpipe»)) {

pipeStream.Connect();

using (StreamWriter sw = new StreamWriter(pipeStream)) {

sw.AutoFlush = true;

string temp;

while ((temp = Console.ReadLine()) != null) {

sw.WriteLine(temp);

}

}

}

Именованные каналы также поддерживают передачу сообщений. Это позволяет считывающему процессу получать сообщения переменной длины от посылающего процесса. В следующем примере показано, как такие сообщения посылаются и считываются:

// Процесс 1

UTF8Encoding encoding = new UTF8Encoding();

string message1 = «Named Pipe Message Example.»;

string message2 = «Another Named Pipe Message Example.»;

Byte[] bytes;

using (NamedPipeServerStream pipeStream = new

NamedPipeServerStream(«messagepipe», PipeDirection.InOut, 1,

PipeTransmissionMode.Message, PipeOptions.None)) {

pipeStream.WaitForConnection();

// Посылка двух сообщений

bytes = encoding.GetBytes(message1);

pipeStream.Write(bytes, 0, bytes.Length);

bytes = encoding.GetBytes(message2);

pipeStream.Write(bytes, 0, bytes.Length);

}

// Процесс 2

Decoder decoder = Encoding.UTF8.GetDecoder();

Byte[] bytes = new Byte[10];

Char[] chars = new Char[10];

using (NamedPipeClientStream pipeStream =

new NamedPipeClientStream(«messagepipe»)) {

pipeStream.Connect();

pipeStream.ReadMode = PipeTransmissionMode.Message;

int numBytes;

do {

string message = «»;

do {

numBytes = pipeStream.Read(bytes, 0, bytes.Length);

int numChars = decoder.GetChars(bytes, 0, numBytes, chars, 0);

message += new String(chars, 0, numChars);

} while (!pipeStream.IsMessageComplete);

decoder.Reset();

Console.WriteLine(message);

} while (numBytes != 0);

}

Три приведенных выше примера показывают, насколько просто осуществлять коммуникации между процессами, применяя появившиеся в .NET Framework 3.5 новые классы.

Коммуникации Peer-to-Peer

Два новых пространства имен — System.Net.PeerToPeer и System.Net.PeerToPeer.Collaboration — содержат классы и дополнительные структуры для реализации коммуникаций типа «точка-точка» (Peer-to-Peer). Пространство имен System.Net.PeerToPeer обеспечивает поддержку базовых коммуникационных механизмов, а пространство имен System.Net.PeerToPeer.Collaboration — расширенные механизмы.

Одна из проблем, которая возникает при организации соединений «точка-точка», — это собственно обнаружение «точек» и обмен идентификаторами, затрудненный отсутствием записей об адресах, таких, например, как DNS (Domain Name System). Инфраструктура Peer-to-Peer в Windows решает эту проблему за счет механизма обнаружения имен и схемы обнаружения точек, которая называется PNRP. Протокол Peer Name Resolution Protocol (PNRP) обеспечивает механизм обнаружения имен для сетей «точка-точка» — он разработан таким образом, чтобы имена обнаруживались и присваивались точкам типа IPEndPoint.

Базовая функциональность протокола Peer Name Resolution Protocol обеспечивается классами, реализованными в пространстве имен System.Net.PeerToPeer. Эти классы обеспечивают возможность создания «точек» и их регистрации в «облаке» (Cloud) существующих «точек». Помимо этого классы поддерживают возможность обнаружения имени (PeerName) для подключения к соответствующей сетевой «точке», порту TCP, «облаку» или другим возможным идентификаторам адреса.

Расширенная функциональность работы в режиме «точка-точка» обеспечивается классами, реализованными в пространстве имен System.Net.PeerToPeer.Collaboration.

В Windows Vista протокол PNRP доступен в виде сервиса, который запускается приложениями при необходимости организации соединений «точка-точка». Помимо этого существует сервис регистрации PNRP, который может быть вручную включен приложениями или пользователями в тех случаях, когда им требуется публикация имен для обеспечения удаленных соединений и коммуникаций.

Версия протокола PNRP 1.0 входит в состав Windows XP Service Pack 2 (SP2), Windows XP Professional x64 Edition, Windows XP Service Pack 1 (SP1) и Advanced Networking Pack for Windows XP.

Пространство имен System.Net.PeerToPeer.Collaboration содержит классы, расширяющие сетевую функциональность классов из пространства имен System.Net.PeerToPeer. В частности, поддерживается возможность создания коммуникационных сессий без использования сервера. Инфраструктура для организации соединений «точка-точка» может применяться в качестве основы для создания различных типов приложений, включая сетевые игры, проведение телеконференций и другие виды активности, предполагающие участие нескольких человек. Инфраструктура, не требующая использования серверов, включает набор программных интерфейсов, которые облегчают процесс обнаружения «точек», отсылки приглашений на подключение, обнаружения «точек» в рамках одной подсети и управления контактами.

Программные интерфейсы Native Peer Collaboration API поддерживаются в 32- и 64-разрядных изданиях Windows Vista, но недоступны в Windows Server 2008.

Механизмы расширений

Пространства имен System.AddIn, System.AddIn.Contract, System.AddIn.Hosting и System.AddIn.Pipeline содержат ряд классов, с помощью которых можно создавать приложения, поддерживающие расширения (addins). Расширение — это код, написанный сторонним разработчиком, который динамически загружается и активируется хост-приложением в определенном контексте (запуск хост-приложения, загрузка документа, возникновение события, вызов функции и т.п.). Такой код предоставляет хост-приложению дополнительные сервисы, может управлять приложением посредством объектной модели, поддерживаемой хост-приложением.

Можно выделить следующие ключевые сценарии применения механизмов расширения:

  • провайдер сервисов:
    • модуль расширения обеспечивает дополнительные сервисы для хост-приложения; например система проверки орфографии для текстового редактора,
    • функциональность хост-приложения может зависеть от провайдера сервисов;
  • управление хост-приложением:
    • хост-приложение обеспечивает сервисы для модуля расширения,
    • пример — модули расширения для приложений Microsoft Office, которые могут быть реализованы на уровне как шаблонов документов, так и самих приложений;
  • расширения функциональности хост-приложений:
    • хост-приложение обеспечивает ключевые точки расширяемости,
    • пример — расширения Microsoft CRM, располагаемые в Microsoft Outlook.

Можно выделить три категории разработчиков, относящихся к созданию и использованию модулей расширения. К первой относятся разработчики расширений. Создаваемый ими код может выглядеть так:

[AddIn(«Sample AddIn», Version=»1.0.0.0»)]

public class AddIn : Calculator

Вторая категория — это разработчики хост-приложений, которые включают в приложения возможность применения моделей расширения:

IList<AddInToken> tokens =

AddInStore.FindAddIns(typeof(AddInType),

addinPath);

foreach (AddInToken token in tokens)

{

token.Activate<AddInType>

(new AddInProcess(), AddInSecurityLevel.FullTrust);

}

К третьей категории отнесем разработчиков объектной модели хост-приложения, которая может использоваться модулями расширения для управления хост-приложением и расширения его функциональности.

Кратко перечислим основные возможности, предоставляемые механизмами расширения, реализованными в .NET Framework 3.5:

  • обнаружение:
    • применяются специальные типы и папки с предопределенными именами,
    • получение метаданных без непосредственной загрузки сборки или активации модуля расширения,
    • отсутствие необходимости в регистрации модулей расширения,
    • отдельное хранилище для модулей расширения;
  • активация:
    • выбор контекста изоляции (домены приложений и/или процессы),
    • создание очереди из загруженных сборок,
    • создание экземпляров компонентов (модулей расширения),
    • типизация согласно типам, используемым хост-приложением;
  • изоляция:
    • изоляция между хост-приложением и модулем расширения,
    • изоляция между модулями расширения,
    • границы изоляции — домены приложений, процесс и домены приложений внутри них;
  • возможность выгрузки:
    • освобождение ресурсов,
    • возможность выгрузки модулей расширения на уровне хост-приложения,
    • возможность выгрузки модулей расширения на основе жизненного цикла приложения;
  • безопасность:
    • модули расширения могут выполняться с уровнем привилегий меньшим либо равным уровню привилегий хост-приложения,
    • три уровня привилегий — Full Trust, Internet, Intranet,
    • поддержка настраиваемых наборов привилегий;
  • управление жизненным циклом:
    • «прозрачная» сборка мусора,
    • возможность выгрузки модулей расширения,
    • выгрузка модулей расширения на основе жизненного цикла приложения.

Пространство имен System.AddIn содержит атрибут AddInAttribute, который применяется для идентификации модулей расширения и их обнаружения. Пространство имен System.AddIn.Contract содержит интерфейсы и структуры, которые обеспечивают основу для обмена данным между компонентами (например, основное приложение и модуль расширения), каждый из которых может обновляться самостоятельно. Компоненты могут использовать интерфейсы и структуры из пространства имен System.AddIn.Contract для обмена данными между процессами или приложениям, а также для коммуникаций с другими компонентами в рамках одного процесса или домена приложения. Интерфейсы, реализованные в пространстве имен System.AddIn.Contract, часто называют контрактами. Все контракты наследуют от интерфейса IContract, который играет ту же роль для компонентов, созданных средствами .NET Framework, что и интерфейс IUnknown для COM-компонентов. Для определения, реализует ли объект тот или иной контракт, применяется метод QueryContract.

Пространства имен System.AddIn.Contract.Automation и System.AddIn.Contract.

Collections содержат дополнительные контракты, расширяющие функциональность пространства имен System.AddIn.Contract. Пространство имен System.AddIn.Contract.Automation включает контракты, которые компоненты могут использовать для доступа к информации о типах и активации определенных членов типов. Пространство имен System.AddIn.Contract.Collections содержит контракты, определяющие коллекции объектов типов IContract и RemoteArgument.

Пространство имен System.AddIn.Hosting обеспечивает классы для обнаружения, регистрации, активизации и управления модулями расширения, а пространство имен System.AddIn.Pipeline включает классы для создания коммуникационных каналов между хост-приложением и модулями расширения.

В следующей статье данного цикла мы рассмотрим основные изменения в Visual Studio 2008, связанные с созданием Windows-приложений.

 

В начало В начало

КомпьютерПресс 8'2008

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует