Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
• Общий компоновочный блок CarGeneralAsm.dll
• Компоновочный блок клиента CarProviderClient.exe
• Компоновочный блок сервера CarProviderServer.exe
Как вы можете догадаться, программный код приложений клиента и сервера более или менее подобен программному коду соответствующих приложений предыдущего примера, особенно в том, как эти приложения используют файлы *.config, Тем не менее, давайте разберем соответствующий процесс построения каждого из указанных компоновочных блоков по очереди.
Создание общего компоновочного блока
В ходе нашего обсуждения процесса сериализации объектов в главе 17 мы создали тип JamesBondCar (в дополнение к связанным классам Radio и Car). Библиотека программного кода CarGeneralAsm.dll будет использовать эти типы, поэтому сначала выберите Projects→Add Existing Item из меню и добавьте в свой новый проект библиотеки классов соответствующие файлы *.cs (автоматически созданный файл Class1.cs можете удалить), Поскольку каждый из добавленных типов уже обозначен атрибутом [Serializable], они готовы для маршалинга по значению в отношении удаленного клиента.
Теперь нам нужен MBR-тип, который обеспечит доступ к типу JamesBondCar. Чтобы сделать ситуацию немного более интересной, ваш MBR-объект (CarProvider) будет поддерживать обобщенный список List‹› типов JamesBondCar. Тип CarProvider определит два члена, которые позволят вызывающей стороне получить заданный тип JamesBondCar, а также полный перечень List‹› соответствующих типов. Вот весь программный код для нового типа класса.
namespace CarGeneralAsm {
// Этот тип является MBR-объектом, обеспечивающим доступ
// к соответствующим MBV-типам.
public class CarProvider: MarshalByRefObject {
private List‹JamesBondCar› theJBCars = new List‹JamesBondCar›();
// Добавление в список нескольких машин.
public CarProvider() {
Console.WriteLine("Создание поставщика машин");
theJBCars.Add(new JamesBondCar("QMobile", 140, true, true"));
theJBCars.Add(new JamesBondCar("Flyer", 140, true, false));
theJBCars.Add(new JamesBondCar("Swimmer", 140, false, true));
theJBCars.Add(new JamesBondCar("BasicJBC", 140, false, false));
}
// Получение всех JamesBondCar.
public List‹JamesBondCar› GetAllAutos() { return theJBCars; }
// Получение одного JamesBondCar,
public JamesBondCar GetJBCByIndex(int i) { return (JamesBondCar)theJBCars[i]; }
}
}
Обратите внимание на то, что метод GetAllAutos() возвращает внутренний тип List‹›. Очевидный вопрос: как данный член пространства имен System. Collections.Generic представляется вызывающей стороне? Если посмотреть описание этого типа в документации .NET Framework 2.0 SDK, вы обнаружите, что list‹› сопровождается атрибутом [Serializable].
[SerializableAttribute()]
public class List‹T›: IList, ICollection, IEnumerable
Таким образом, для всего содержимого типа List‹› будет использован маршалинг по значению (если содержащиеся в нем типы также допускают сериализацию). Это очень удобная особенность удаленного взаимодействия .NET и членов библиотек базовых классов. Вдобавок к пользовательским MBV- и MBR-типам, которые вы можете создать сами, любой тип из библиотек базовых классов, сопровождающийся атрибутом [Serializable], также способен выступать в качестве MBV-типа в архитектуре удаленного взаимодействия .NET. Аналогично, любой тип, получающийся (непосредственно или косвенно) из MarshalByRefObject, может функционировать, как MBR-тип.
Замечание. Следует знать о том, что SoapFormatter не поддерживает сериализацию обобщенных типов. При создании методов, получающих или возвращающих обобщенные типы (напри-мер, List‹›), вы должны использовать BinaryFormatter и объект TcpChannel.
Создание компоновочного блока сервера
Компоновочный блок сервера (CarProviderServer.exe) в рамках метода Main() содержит следующую программную логику.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using CarGeneralAsm;
namespace CarProviderServer {
class CarServer {
static void Main(string[] args) {
RemotingConfiguration.Configure("CarProviderServer.exe.config");
Console.WriteLine("Старт сервера! Для остановки нажмите ‹Enter›");
Console.ReadLine();
}
}
}
Соответствующий файл *.config почти идентичен файлу *.config сервера, созданному в предыдущем примере. Единственным заслуживающим внимания моментом здесь является определение значения URI объекта для типа CarProvider.
‹configuration›
‹system.runtime.remoting›
‹application›
‹service›
‹wellknown mode="Singleton" type="CarGeneralAsm.CarProvider, CarGeneralAsm" objectUri="carprovider.rem" /›
‹/service›
‹channels›
‹channel ref="tcp" port="32469" /›
‹/channels›
‹/application›
‹/system.runtime.remoting›
‹/configuration›
Создание компоновочного блока клиента
Наконец, рассмотрим приложение клиента, которое будет использовать MBR-тип CarProvider для получения отдельных типов JamesBondCars и типа List‹›. После получения типа от CarProvider вы посылаете его вспомогательной функции UseCar() для обработки.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using CarGeneralAsm;
using System.Collections.Generic;
namespace CarProviderClient {
class CarClient {
private static void UseCar(JamesBondCar c) {
Console.WriteLine("-› Имя: {0}", с.PetName);
Console.WriteLine("-› Макc. скорость: {0} ", с.MaxSpeed);
Console.WriteLine("-› Способность плавать: {0}", с.isSeaWorthy);
Console.WriteLine("-› Способность летать: {0}, c.isFlightWorthy);
Console.WriteLine();
}
static void Main(string[] args) {
RemotingConfiguration.Configure("CarProviderClient.exe.config");
// Создание поставщика машин.
CarProvider cр = new CarProvider();
// Получение первого объекта JBC.
JamesBondCar qCar = cp.GetJBCByIndex(0);
// Получение всех объектов JBC.
List‹JamesBondCar› allJBCs = cp.GetAllAutos();
// Использование первой машины.
UseCar(gCar);
// Использование всех машин в List‹›.
foreach(JamesBondCar j in allJBCs) UseCar(j);
Console.WriteLine(''Старт клиента! Для остановки нажмите ‹Enter›");
Console.ReadLine();
}
}
}
Содержимое файла *.config на стороне клиента также соответствует ожиданиям. Здесь нужно просто изменить URL активизации.
‹configuration›
‹system.runtime.remoting›
‹application›
‹client displayName = "CarClient"›
‹wellknown type= "CarGeneralAsm.CarProvider, CarGeneralAsm" url="tcp://localhost:32469/carpovider.rem"/›
‹/client›
‹ channels ›
‹channel ref="http" /›
‹/channels›
‹/application›
‹/system.runtime.remoting›
‹ /configuration ›
Теперь запустите свои приложения сервера и клиента (конечно же, в указанном порядке) и рассмотрите соответствующий вывод. В окне консоли клиента будут представлены объекты JamesBondCar и соответствующая информация для каждого типа. Напомним, что вы взаимодействуете с List‹› и типами JamesBondCar, поэтому вы работаете с их членами в рамках домена приложения клиента, так как оба указанных типа обозначены атрибутом [Serializable].
Читать дальшеИнтервал:
Закладка: