WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     || 2 | 3 | 4 | 5 |
-- [ Страница 1 ] --

т Посвящается Тиму и Эрин — я живу благодаря людям, которых люблю.

Douglas J. Reiily DESIGNING Microsoft* ASP.NET APPLICATIONS Press Д. Рейли СОЗДАНИЕ ПРИЛОЖЕНИЙ Microsoft* ASP.NET Москва 2002 004.45 ББК 32.973.26-018.2 Р31 Д.

Р31 Создание Microsoft с англ. — М.;

Из дом «Русская Редакция», 480 ил.

ISBN 5-7502-0218-6 Эта книга познакомит с флагманской технологией Mic rosoft Framework и средой исполнения CLR. Вы на учитесь разрабатывать Web-приложения в среде а также Web формы Кроме того, вы узнаете об элементах управления а в том числе о серверных HTML-элементах управления и эле ментах входных данных, о пользовательских и не стандартных элементах о том, как взаимо с SQL Server средствами и элементов управления с поддержкой данных. Отдельную главу автор по святил особенностям создания XML Web-сервисов и их организации общего доступа к данным в распределенных средах.

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

Книга состоит из 10 глав, 2 и предметного указателя.

ББК 32.973.26-018. Подготовлено к изданию по лицензионному договору с Microsoft Corpo ration, Редмонд, США.

ActiveX, JScript, Microsoft. Microsoft Press, MS-DOS, Visio Studio, Visual Basic, Visual C + +, Windows NT и Windows товарными знака ми или охраняемыми знаками корпорации Microsoft в США и/или других странах. Все другие товарные знаки являются собственно стью фирм.

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

© Оригинальное издание на английском Дуглас Рейли, © на русский Microsoft Corporation, ISBN 0-7356-1348-6 (англ) Оформление и подготовка к изданию, ISBN 5-7502-0218-6 дом «Русская IX Введение XII ГЛАВА 1 ОСНОВНЫЕ СВЕДЕНИЯ О РАЗРАБОТКЕ В ASP.NET Задача: разработка динамических Web-приложений Первое решение: CGI CGI Недостатки CCI Второе решение: Преимущества ISAPI Недостатки ISAPI Лучшее решение: ASP Преимущества ASP Недостатки ASP Новое решение: ASP.NET Заключение ГЛАВА 2 КОД И СРЕДА ИСПОЛНЕНИЯ COMMON LANGUAGE RUNTIME... Краткий обзор Framework Промежуточный язык Microsoft Intermediate Language «Just in Time» код и данные О небезопасном коде Заключение ГЛАВА 3 ОБЪЕКТЫ И ЯЗЫКИ FRAMEWORK Решение проблемы совместимости типов в Размерные типы Ссылочные типы Встроенные ссылочные типы Классы в Framework Основные сведения о Visual Basic Старье — на помойку! VI Оглавление Дорогу новому! Основные сведения о языке С# Различия и С# Что можно делать в С#, но нельзя — в Visual Basic Заключение ГЛАВА 4 ОСНОВЫ РАЗРАБОТКИ ПРИЛОЖЕНИЙ В ASP.NET Здравствуй, мир ASP.NET! Пример Пример на Visual Методика разработки приложений в ASP.NET Создание Web-приложений в Visual Studio Visual Studio и US-сервер Первая Web-страница, созданная в Studio Другие виды ASP.NET XML Web-сервисы и HTTP-модули Конфигурирование приложений Где хранится файл Раздел authentication Раздел authorization Раздел customErrors Раздел Раздел httpModules Раздел identity Раздел pages Раздел processModel Раздел Раздел trace Заключение ГЛАВА 5 WEB-ФОРМЫ Классическая архитектура Пример проверки вводимых данных в формах ASP.NET Серверные элементы управления в ASP.NET и в HTML Элементы управления правильности вводимых данных Элемент управления RequiredFieldValidator Элемент управления CompareValidator Другие элементы проверки данных Оглавление VII Несколько элементов управления, проверяющих одно поле Элемент управления Сохранение информации о состоянии элементов управления в ASP.NET Программное управление серверными элементами управления Заключение ГЛАВА 6 СОЗДАНИЕ КОМПОНЕНТОВ Хлопоты с компонентами Классы элементов управления ASP.NET Жизненный цикл элемента управления Создание пользовательских элементов управления Подготовка для преобразования в пользовательский элемент управления Преобразование Web-страницы в элемент управления Создание нестандартных элементов управления Пример нестандартного элемента управления Создание простого нестандартного элемента управления в Visual Studio Более сложный нестандартный элемент управления Составной нестандартный элемент управления Внедрение элемента управления в пользовательский интерфейс Visual Studio Расширение режима конструктора Заключение ГЛАВА 7 РАСПРЕДЕЛЕНИЕ СЕРВЕРОМ И КЛИЕНТОМ Разработка клиентских сценариев Клиентские сценарии в ASP.NET Инициирование обращения к серверу из пользовательских элементов управления Создание расширенных элементов управления на стороне клиента Заключение ГЛАВА 8 ВРЕМЯ ЗАНЯТЬСЯ ДАННЫМИ! XML как универсальный язык данных Сравнение существующих решений форматирования данных с подходом на основе XML ли Интерфейс VIM Оглавление Основные сведения об Краткий экскурс в ADO Различия между ADO и ADO.NET Использование ADO.NET в ASP.NET Классы SqICIient и Преобразование в Заключение ГЛАВА 9 ДАННЫЕ И ФОРМЫ ASP.NET Доступ к данным с применением Доступ к данным с использованием форм ASP.NET Серверный элемент управления DataCrid Изменение DataGrid в конструкторе Visual Studio DataGrid в Visual Basic Серверный элемент Repeater Основы работы с элементом управления Repeater Создание страниц ввода данных Создание пользовательского интерфейса Обработка ввода данных Заключение ГЛАВА 10 XML WEB-СЕРВИСЫ Стандарты XML Web-сервисов Создание простого XML Расширение и тестирование XML Web-сервиса Использование свойств атрибута WebMethod Обращение к простому XML Web-сервису XML Web-сервисы и программы командной строки Реальный XML Web-сервис: публикация статей Параметры безопасности Создание и XML Web-сервиса Обращение к XML Web-сервису Возможные усовершенствования Заключение Приложение А Приложение Б Предметный Об авторе Я принадлежу к тем немногочисленным которым удалось после того, как у них был обнаружен рак пече ни. Такая беда приключилась, когда я работал над этой книгой, и параллельно с литературной деятельностью мне пришлось прой ти курс То, что почти четыре года спустя, я пишу эти строки, я приписываю фортуне, отличным технологиям и хо рошим людям. в ряду хороших людей — доктор Гер дес Gerdes) из Ракового памяти Слоуна Кэттеринга (Memorial Sloan Cancer Center) и его секретарь Джоанн Бут-Песантес (Joanne Booth-Pezantez). Д-р Гердес не стал ограни чиваться простой типа «мы не знаем, что это за пятно на печени Дуга». Для меня он больше чем доктор — он стал тем, к кому я могу обратиться за советом и в том ужасе, торым для меня стал наследственный полипоз корень проблем со здоровьем з моей семье. Подробности об этом и других наследственных раковых кишечника вы можете узнать на сайте http://www.hereditarycc.org.

Я также поблагодарить двух Фредов [Фреда Стодолак (Fred Stodolak) и Фреда Палиани (Fred Paliani)], Джима на (Jim Hoffman), Рича Явароне (Rich lavarone), Тару О'Нейл O'Neill) и Надала (Jason из Общества любите гольфа США. «Фреды» создали для меня рабочую обстанов ку: я не только получил возможность работать с чудесными тех нологиями, но мог одеваться как вздумается, не следуя корпора тивным стандартам з одежде. Они также любезно разрешили мне использовать пару статей с сайта Американского лю бителей гольфа (http://www.golfsociety.com) в качестве приме ров в глазе 10. Джим оказался самым лучшим боссом для типа меня, который предпочитает «закопаться» в подвале и ко выряться с компьютерами. Джим просмотрел некоторые из глав, и его откровенная оценка того, что важно, а что нет, сильно по могла мне в работе. Рич и Джейсон оказали мне неоценимую помощь, консультируя по вопросам Тара чудесным X Благодарности образом преобразила фотографию — теперь ее без стесне ния можно публиковать разделе «Об авторе». може те мне ей не слишком уж пришлось повозиться с моим изображением! Спасибс В свободное время я много делаю для «Система здра воохранения (St. Barnabas Health Care System, SBHCS). С позволения Коллинс (Kathy Collins) и Рича Уитли (Rich Wheatley) мне удалось четыре с небольшим года прорабо тать над проектами уже после того, как я пере стал работать в SBHCS на полной ставке. В SBHCS я получил можность программы в среде, со здавая «крутые» системы для одной из крупнейших в штате инт Кроме Рича и Кэйти я также тесно сотрудничаю с Дарси Киндред (Darcy Kindred) (она настоящая богиня интерфейса), Райаном Гримом (Ryan и Джоанн Гибсон (Joanne всех и не упомнишь, Спасибо за ваше терпение. Особую благо дарность хотелось бы выразить сотрудникам центра вызовов подразделении поведенческих дисциплин в SBHCS за то, что они терпели все задержки в реализации их системы из-за моего перегруженного графика во время работы над этой книгой.

Сьюзен Уоррен (Susan Warren) из Microsoft оказала неоценимую помощь, когда я задерживал очередную главу, потому что при меры отказывались работать. Ее терпение при поиске моих оши бок и ее готовность докапываться до сути, когда возникали се рьезные неполадки, неоценимы. Сьюзен, а также Скотт (Scott Guthrie) и Роб Ховард (Rob очень помогли мне и все авторам, об в начале работы, когда мы собрались на встрече — кажется, это было так давно!

На той встрече, на практическом занятии, я оказался рядом с Эндрю Andrew Duthie) из компании Craymad Enterprises, С тех пор мы переписываемся и выражаем друг другу сочувствие по электронной почте и лично на различных конференциях.

дрю вот-вот закончит свою книгу no и я рекомендую ее вам. Думаю, Эндрю — самый из изве стных мне сторонников технологий Microsoft. В числе людей, к ко торым я обращался за консультацией по технической части, да просто за советом, хотелось бы упомянуть Еда Колоси (Ed Colosi), Тома Диньяна (Tom Dignan), Заккарди (Michael Zaccardi) XI и Шоу (Sue Shaw). Клодетт Мур (Claudette Moore), агент, работала над больше чем, над некоторыми другими.

Спасибо за содействие в выпуске книги в свет и за помощь в при ведении моих в порядок.

Написание книги в Microsoft Press отличается от аналогичной ра боты в других Но в моем случае эта работа отли чалась даже от обычных процедур Microsoft Press. Это не совсем та книга, которую я первоначально планировал, и по большому счету виной тому огромный успех даже з бета-версии.

По этой причине было важно выпустить книгу быстро, без про медления, хотя приходилось очень оперативно вносить правку, Все редакторы, которые работали над книгой: Салли Стик ни (Sally Харрис Harris), Дэвид Кларк (David Clark) и Роберт Лайон (Robert Lyon) — себя наи лучшим образом даже в условиях ужасающе сжатых сроков, обычных неполадок в программного продукта и по стоянно возникающих у меня идей, что «обязательно нужно до бавить еще то и это». В таких ситуациях Роберт не раз защищал меня от меня. Спасибо!

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

Моя жена Джин, с которой мы вместе уже 23 года, все это вре мя была «стержнем» нашего семейства. Когда я отвлекался на что-нибудь, именно Джин настаивала, чтобы первую очередь делалось что дОлжно. В нашем случае это были почти невные контакты с по страхованию здоровья.

за одно это она заслужила место в раю. Конечно, много всего и помимо этого. Помните эту фразу: радости и печали, в бо лезни и Джин понимает ее буквально! В нашей жиз ни было больше печали и чем и но я всегда знал, что есть будет рядом в трудную минуту, никогда не бросит и не разочаруется. Джин, я желаю нам быть вместе по мере следующие сто лет!

look I miss all the good stuff.

when I look up, I just trip over things.

я теряю из виду много интересного, А когда то «скольжу» поверх Ани Когда больше года назад на конференции авторов я услышал об корпорации Microsoft, я что все это кажется слишком хорошим, чтобы быть Неужели теперь мы сможем создавать основанные на скомпили рованной программе, используя один из объектно ориентированных языков? Использовать настоящие переменные с типами и всем Создавать серверные компоненты в среде инкапсулируя все нужные моему приложению фун кции и не заботясь о СОМ-компонентов? Исполь зовать специальные проверочные компоненты (validator), чтобы чудесным образом проверять пользователями данные как на клиенте, так и на сервере? Как я уже сказал, это звучало слишком хорошо, чтобы быть На самом деле возможности оказались даже больше. В сильно упрощен процесс разработки Web-приложений.

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

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

Введение XIII Я попытался здесь рассказать о которые следует чтобы что-то сделать, но среда Framework В ней тысячи классов. Часто я отсылаю читателя к документации по Framework з MSDN, да вам настоятельно рекомендую пользоваться этим источником. Если нужно что-то делать со стро ками, поищите в MSDN о Если требуется выполнить операции с файлами, про странством имен Я старался не дублировать информа цию, есть в MSDN, кроме тех случаев, когда приходилось исчерпывающе описывать задачу (а эту книгу можно считать в не котором роде учебным пособием), начиная с азов и последова тельно переходя к задачам «реального» мира и их решениям, Кому эта книга предоставляет возможности в настоя щее время работающих с ASP, создавать более мощные и масш табируемые Web-приложения, а программистам, которые ниче го раньше не знали о Web-приложениях, начать их разрабатывать.

Из-за такой разнородности аудитории предполагаемых читателей книги мне приходится учитывать интересы и тех, кто не может похвастаться огромным опытом Специ ально для них в конце книги я поместил приложение Б с кратким справочником по языку HTML.

Поскольку в читатели с равной вероятностью могут ис пользовать Microsoft Visual Basic и я не стараюсь ори ентироваться исключительно на какой-то один из этих языков в ущерб другому. Как так и разработчики, пи шущие на и плохо знакомые с вполне поймут ис ходные тексты примеров. В книге есть примеры как на Visual Basic так и на В тех немногих случаях, когда различия в языках существенны, я показываю пример на обоих языках или чаще просто указываю на имеющиеся разли чия. Знание Framework — вот что вам прежде всего потре буется программирования в Структура книги Глава 1 посвящена основам разработки в Чтобы облег чить понимание материала главы, я познакомлю вас с историей технологий, которые предшествовали Если вы плохо XIV Введение знакомы с разработкой из этой главы вы по черпнете много полезных В главе 2 рассказывается управляемом коде и общеязыковой среде исполнения CLR (Common Language Runtime). В разработка прикладных про грамм коренным образом отличается от создания традиционных Если вы еще не занимались программирова нием для (а на настоящий момент мы все з этом деле но эта глава позволит зам быстро вникнуть в дела.

Вечная разработчиков, пишущих на Visual Basic и C+ (особенно тех, кто применяет оба — отсутствие у этих язы ков общих типов. Кроме того, дополнительные сложности создает отсутствие удобного доступа ко всем возмож ностям Win32. В главе 3 расскажу о том, как обе указанные проблемы в Framework. Глава 4 посвяще на программированию в среде ASP.NET. На примерах как на Visual и я покажу, как создавать приложения ASP.NET в Visual Studio Это очень удобная создания приложений ASP.NET, разработка в ней сильно отличается от программирования в более простых редактозах, но иногда нужны и они.

В главе 5 описано создание Web-форм ASP.NET. Все приложения ASP.NET базируются на Web-формах. Разработчикам, не знако мым с ASP-NET, но прекрасно знающим ASP, я рекомендую по знакомиться с методикой разработки в ASP.NET, так она силь но отличается от ASP. Из главы 5 VB-разработчики узнают обо всех тех особенностях, которые отличают Web-формы, от форм, к которым они привыкли.

В главе 6 описаны новые способы разработки компонентов. По мимо создания пользовательских элементов управления, в ASP.NET предоставляется возможность программировать компоненты на тех же языках, которые для создания Web-форм, или же на языках, не поддерживаемых Frame work. В главе 7 рассказывается о создании в кото рых комбинируются функции сервера и клиента, так как в ситуациях разумно выполнять задачу на клиенте, а в других — Из главы 7 вы узнаете, как создавать компоненты и распределять функции между клиентом и сервером.

Глава 8 посвящена Ни один экскурс в ADO.NET нельзя считать полным без рассказа об XML, именно об этом и здесь речь. В главе 9 описаны способы приме Введение XV нения с некоторыми серверными элементами управле которые позволяют создавать данных на много легче, чем вы даже можете мечтать. Кроме того, на при мере работы с реальной данных я продемонстрирую, как создать форму, которая позволяет пользователю добавлять, ре дактировать и записи.

В последней главе 10 на примере той же базы данных я покажу, как предоставить совместный доступ к XML Web-службам. Эти службы — новый способ предоставления функций в общий дос туп как в рамках предприятия, так и глобальной сети.

О вспомогательных материалах Исходные тексты и другие вспомогательные мо жете загрузить с издательства «Русская Редакция» Все примеры проверены во бета версии Microsoft Visual Studio в базовой конфигурации сис темы, состоящей из системы Microsoft Win dows 2000 Server SP2 и Web-серзера IIS (Information Internet Services). В примерах глав 8, 9 и демонстрируется доступ к базе данных, поэтому для них потребуется сервер Microsoft SQL Server 2000. В главах 9 и 10 используется база данных GolfArticles, она есть в комплекте вспомогательных материалов.

В каждой папке с примерами есть файл Readme, в котором со держатся инструкции по и работе с примерами. Не забудьте ознакомиться с ними до начала работы.

Для работы примеров этой книги необходимо следующее:

• Microsoft Visual Studio версии бета 2 или более поздней;

• ОС Microsoft Windows 2000 или Microsoft Windows XP;

• Microsoft SQL Server 2000 (для примеров из глав 8, 9 и Извинения автора Я предпринял все усилия, чтобы обеспечить точность информации, содержащейся в этой книге и во вспомогательных материалах.

Несмотря на всю помощь сотрудников Microsoft и Microsoft Press, вина за любые ошибки или пробелы в конечном итоге лежит на мне. — это новая технология, и на момент написания книги она есе еще немного менялась. Роберт Лайон (Robert Lyon), технический редактор книги, неоднократно замечал:

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

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

Дуглас Рейли Материалы издательства Microsoft Press Издательство Microsoft Press постоянно обновляет список исправ лений и дополнений к своим книгам, он доступен на Web-узле Если у вас есть комментарии, или идеи по этой книге, их в издательство Microsoft Press no одному из пе речисленных ниже адресов.

Почтовый адрес:

Microsoft Press Attn: Designing Microsoft Applications Editor One Microsoft Way Redmond,WA Электронная почта: MSPINPUT@MICROSOFT.COM что по указанным почтовым адресам техническая поддер жка не предоставляется.

Глава Эта книга но вы не сможете з полной мере оценить эту технологию, не знал, как изменялись процессы раз работки Web-приложений на протяжении последних лет. В этой главе я вкратце познакомлю вас с традиционными способами разработки Web-приложений: с языком CGI (Common Gateway Interface), (Internet Server Application Programming Interface) и ASP-страницами (Active Server Pages). Хотя эти ренные годами способы вполне годятся создания Web-при ложений, в создание масштабируемых динамических Web-приложений выполнять гораздо проще.

,..И был создан язык разметки гипертекста (Hypertext Markup Language, HTML). И это было хорошо... В действительности о нем и вряд ли кто отзовется плохо. Это то он описывает, как текст и графические элементы.

HTML-документы содержат которые управляют отображе нием элементов документа, — ключевые слова (часто с атрибу тами), обрамленные знаками «меньше» и «больше» (<>) (их еще называют угловыми скобками). тэг указы вает на начало тела документа. Большинству (хотя и не у всем) тэгам соответствует парный закрывающий тэг, в котором эле 2 Глава предшествует правая наклонная черта (/), например применяющиеся разрыва строк (
) и обозначения начала (<Р>), обычно не закрываются пар ными им тэгами. Более подробно об HTML рассказано в приложе нии Б.

Языка HTML вполне достаточно отображения статической информации, которая редко изменяется и не зависит от того, кто ее просматривает. На протяжении многих лет после появления HTML такого способа статичного отображения информации было вполне достаточно. Вы себе не как трудно в на чале протекала совместная работа над документами. В то время документы в форматах WordPerfect, WordStar или Word Microsoft. Дою/менты, созданные в программе, практически всегда недоступными из других про и в качестве общего языка применялся формат ASCII — он позволял передавать содержимое документа, но за это при ходилось платить полной форматирования.

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

HTML и протокол передачи информации в формате HTML HTTP Transfer Protocol) предоставили дополнительные преимущества. очень «легок», поэтому он обес печил эффективное использование весьма ограниченной в то время пропускной способности каналов связи. Мой компьютер теперь подключен к Web no быстрому кабельному модему, но до этого многие годы я просматривал Web-страницы, пользуясь модемом со скоростью 23,8 или 56 кбит/с. Но даже таких стей вполне хватало для получения HTML-документов. HTTP не только нетребователен к пропускной способности, но и несиль но нагружает сервер, который хранит и предоставляет HTML страницы клиентам по запросу.

Основные сведения о разработке в Задача: разработка динамических Web приложений Со временем стало понятно, что кроме простого страниц HTTP можно использовать для отображения динамичес кой информации. Обратите что я не считаю динами ческим информационным наполнением (dynamic content) аними значки и танцующих домашних которые встречаются на многих Web-страницах. Обычно подобная ани мация создается с применением JavaScript-сценариев, выполня емых браузером пользователя. Под динамическим наполнением я подразумеваю информацию, содержание которой определяет ся тем, она предназначена, и которая отличается от просмот ра к просмотру. Динамическое содержимое позволяет обеспечить обмен информацией. Используя формы на Web пользователь получает возможность запрашивать ин формацию различного Например, транспортный идентификатор партии товара, он может подробнее узнать, где она находится в данный момент. что обмен пользо вателя и сервера состоит не только из форм и информации;

еще файлы-cookies — небольшие кусочки информации, которые на пользовательской машине и позволяют идентифицировать пользователя в процес се сеанса связи или при следующем посещении Web-узла.

Примечание Выполняемых на стороне клиента сценариев на JavaScript или на другом языке обыч но недостаточно для создания полноценных динами ческих Web-страниц. Хотя сценарии и чем простые картинки, и особенно полезны для проверки правильности заполнения форм клиентом без необходимости повторного об ращения к серверу, значительно упроща ет создание процедур проверки правильности вво димых данных. В главе 5 я расскажу о стандартных процедурах проверки, а в главе 6 как со здавать собственные в которых эф фективное и надежное приложение состоит из кода, расположенного на клиенте и на сервере.

4 Глава В середине 1990-х многим компаниям пришлось снижать сово купную стоимость владения (total cost of ownership, TCO). Вмес те с тем традиционный «толстый» клиент с противоречивыми динамически подключаемыми библиотеками (DLL) и параметра ми реестра стал составлять большую часть ТСО. Поэтому мно гие компании з способ быстро развер нуть на предприятии критически важные при мини мальном переконфигурировании клиентских машин. Например, когда я пишу эти строки, я использую несколько приложений, с применением почты, — пользовате лям просто предоставили URL-адреса и начальные инструкции по работе в системе. Регистрируя нового пользователя, ратор инициирует ответ по почте;

таким образом, сокращаются усилия по развертыванию прило жения.

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

Первое решение: CGI Gateway — одно из первых решений, созданных доставки Web-информа он до сих пор популярен в мире UNIX.

ния — это программы, исполняемые на Web-сервере и обычно используемые для предоставления динамической Web-информа ции. В листинге 1-1 показан пример простого консольного CGI приложения, которое отображает в браузере строку «Hello CCI World».

// ftlnclude ftinclude char* Основные сведения о разработке в CGI CGI return 0;

Листинг 1-1. Простое Эта очень простая выводит и и HTML текст, которые отображаются з браузере, как показано на рис. Первая функция минимально необходимую заголовочную информацию. Первый заголовок информирует о версии HTTP и предоставляет код, указывающий на успех операции (200 ОК). Следующая строка сообщает тип ин формации — в данном случае это На основе таких дений браузер узнает, как интерпретировать данные. Например, если вместо указать браузер интер претирует информацию как документ в формате Microsoft Word или RTF, а не HTML. Перечень заголовков двумя па рами знаков «возврат каретки/перевод строки», которые сигна лизируют о завершении заголовков. Далее следует обычная ин формация в формате HTML.

Hello CGI World.

Рис. 1-1. Отображение в окне браузера страницы, полученной в результате работы программы, показанной в листинге 1- Глава О консольных Хотя программу из листинга 1-1 можно скомпилировать как стандартное приложение MS-DOS, я лировал ее как полноценное 32-разрядное консольное при ложение. Как из в процессе исполнения это приложение напоминает старое, доброе MS-DOS-приложе ние текстового режима, но на самом деле это настоящее 32 разрядное приложение, способное практичес ки к любым загружать DLL-библиотеки и т. п. Сегодня есть и лучшие способы создания приложений на скорую руку, но некоторые (особенно утили ты строки) лучше работают как консольные. При ложения-службы (те, что работают, даже когда ни один пользователь не вошел в систему) — это консольные при ложения, которые в своей работе используют пару-тройку специальных API-функций.

В стандартных приложениях под стандартным уст ввода клавиатура, а под стандартным устройством вывода — экран.

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

Основные о разработке в Преимущества CGI способна выполнять практически все, что вы по — получать доступ к базам данных, считывать файлы, работать с системным реестром и все остальное, что обычно делает В листинге используется C/C+ +, но ничто не мешает восполь зоваться любым языком программирования или разработки и создать приложение, считывающее со стандартного устройства ввода и записывающее в стандартное устройство вывода. В мире UNIX для применяется а среди поклонников Win32 популярна среда Delphi Borland, которая явно поддерживает предоставляя классы, управляющие чтением записью в стан дартные устройства.

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

Недостатки CGI Чтобы понять недостатки CGI, следует поближе познакомиться с тем, что происходит при исполнении CGI-программы. Напри мер, вызова приложения, показанного в листинге 1-1, мож но использовать следующий URL-agpec:

Возможен один из двух сценариев поведения сервера Microsoft Internet Information Services при этого URL-адреса: IIS либо предложит загрузить программу SayHelloCGI.exe с виртуаль ного каталога sayhellocgi на локальную машину, либо выполнит ее.

Естественно, нам нужно, чтобы программа выполнялась, для это го следует разрешение на исполнение в указанном виртуальном каталоге. (Подробнее о таких разреше ний рассказано в приложении А.) 8 Глава При наличии соответствующих разрешений после ввода адреса SayHetloCCI.exe исполняется с информацией, поступив шей через стандартное и отправляет инфор предназначенную стандартному устройству в браузер. Если G заголовках содержится ошибка если отсутствует вторая знаков «возврат каретки/перевод стро ки», заголовочный блок), одни браузеры просто проигнорируют текст, другие отобразят окно с сообщением об ошибке и выведут текст на стандартное устройство вывода.

Выполнив свою задачу, завершает работу.

Модель CCI хороша тем, что после завершения работы грамму можно так же, как и любую другую программу, изменять или удалять;

однако эта является и недостатком CGI. При исполнении CGI-программа загружается, а по заверше нии работы полностью удаляется из памяти. Много ресурсов тра тится на создание и удаление процессов. Создание процесса — более ресурсоемкая операция по скажем, с простым считыванием HTML-файла. В конечном счете, подобное создание и удаление процессов сильно снижает производительность, а так же перегружает ресурсы. Когда 100 клиентов одновременно об ращаются к одной в памяти создается экзем пляров этой программы. Ресурсы Web-сервера активно «пожи что сказывается на масштабируемости.

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

Второе решение:

Microsoft разработала для разработчиков новый способ создания масштабируемых приложений, который призван устранить при сущие CGI проблемы с производительностью и масштабируемо стью. Эта альтернатива называется (Internet Server Application Programming — API-ин терфейс Интернет-сервера). Вместо исполняемых файлов в ISAPI DLL-библиотеки, что позволяет повысить произво дительность и масштабируемость.

Основные сведения о разработке в В ISAP! два типа DLL-библиотек:

extensions) и filters). Первые ука зываются в URL-адресе, на например, так:

можно вызывать с параметрами, которые по зволят одному компоненту выполнять разные задачи. Так же как в случае с CGI, в каталоге следует предоставить разрешения на исполнение, в противном случае DLL загружается на а не исполняется на сервере. ISAPI-расширения обычно применяют ся для обработки клиентских запросов и возвращения ответа в формате HTML. Это очень похоже на схему работы грамм.

В CGI нет прямого аналога функциям, выполняемым трами. никогда не вызываются явно — обращается к ним в ответ на определенные события з процессе запроса:

• на завершение обработки сервером клиен том заголовков;

• на завершение сервером процедуры аутентификации клиента;

• на сопоставление сервером логического URL-адреса физичес кому;

• до начала пересылки «сырых» данных от клиента на сервер;

• на завершение пересылки «сырых» данных от клиента, но до начала их обработки на сервере;

• на регистрацию информации сервером в журнале;

• на сеанса.

Как любой фильтр, должен запрашивать лишь нужные ему уведомления и обрабатывать их максимально быстро. Чаще всего применяются для поддерж ки особых процедур аутентификации. Другое применение — модификация HTML-текста перед отправкой клиенту, например для изменения цвета фона страниц. Поскольку ISAPI-фильтры не столь как я ограничусь только эти ми сведениями. Более подробную информацию об Глава рениях вы в моей книге «Inside (Microsoft Press, 1999).

В определено несколько точек входа в функции, экспорти руемые из DLL. Эти точки входа IIS загружать DLL, вызывать реализованные в ней функции, передавая при необхо димости нужные и получать данные для отправки в браузер. ISAPI требует наличия реализации по ней мере двух точки входа — и часто создаются с использованием библиотеки MFC (Microsoft Foundation Class Library). Это зна чительно Например, если в среде Microsoft Visual C++ 6.0 в диалоговом окне New Projects выбрать вариант ISAPI Extension Wizard, откроется пер вая страница мастера создания (рис. 1 Если вам нужно только этого вполне достаточно — нажмите кнопку Finish, и мастер создаст все необходимые ISAPI файлы. В описанном примере назвал рение SayHellolSAPI.

API ч the MFC Рис, 1-2. Первый этап ISAPI-расширения в Visual 6. Основные сведения о разработке в Одна из созданных мастером функций называется Что бы функции, (ли стинг я изменил созданную мастером реализацию 1-2).

// command handlers void pCtxt) } Листинг 1-2. Функция Default в простом Обратите внимание, что вся отображаемая в окне браузера инфор записывается явно. Реализация по умолчанию функции создает открывающие тэги и .

Реализация по умолчанию функции вызывает GetTitle и затем обрамляет полученный текст тэгами и Я заменил реализацию по умолчанию функции GetTitle и задал собственный заголовок, как в примере с в листинге 1 сле дующим образом:

LPCTSTR const I return "Hello ISAPI World";

Функция расставляет закрывающие тэги и .

После компиляции DLL-библиотеки и создании соответствующего виртуального каталога в IIS, можно в каталог и выполнить, введя корректный URL-ag рес. В окне браузера отобразится страница, похожая на показан ную на рис. 1-3.

Глава Рис. 1-3. программой SayHellolSAPI, в браузере Преимущества ISAPI В ISAPI устранены многие из недостатков В от личие от CGI-приложений, процессы которых создаются и унич с каждым код ISAPI-расширения обычно за гружается раз и на все время работы сервера (если только память не понадобится для других что случается В качестве дополнительного преимущества стоит упомянуть то, что выполняется в процессе обес печивая лучшую с IIS. В последних вер сиях IIS администратору предоставляется больший контроль над там, в какой области исполняются отдельные приложения, Обычно новые или сомнительные приложения работают в ном процессе, отличном от процесса самого Испол нение в существующем процесса и постоянное расположение в памяти обеспечивает существенные преимуще ства с точки зрения как так и масштабиру емости.

Как и в CGI, одно ISAPI-приложение может выполнять разные задачи, принимая параметры, которые передаются в URL-agpe се. Отличие ISAPI в том, что классы MFC скрывают от разработ чика многие из деталей разбора параметров.

При использовании карт разбора (parse maps) (макрокоманд пре процессора, которые обычно применяются в MFC-приложениях) запросы «прозрачно» отображаются на функции-члены основного класса ISAPI-расширения, потомка класса Для Основные сведения о разработке в кому не предусмотрена использова ния в только к ISAPI, в обход структуры классов в MFC. В облегченном серверном при ложении это отсутствие дополнительного «багажа» может стать существенным преимуществом.

Недостатки ISAPI Почти все недостатки ISAPI относятся к процессу разработки Прежде разрабатывать их сможет не всякий программист этого требуются знания C + + и а также HTML. что перечисленные наборы навыков ни как не связаны друг с другом, значит, не сказать ничего. Хотя большинство программистов знакомы с MFC и многие из них знают HTML, тех, кто знаком и с тем, и с другим, не так уж и много. Разработчики, знающие MFC, скорее всего разрабатыва ют традиционные Windows-приложения, для чего HTML не тре буется. В отличие от других упомянутых в этой главе технологий разработки Интернет-приложений, разработку не так-то просто разделить на написание собственно приложения и создание интерфейсной части. ISAPI — это единая, монолитная DLL, и если не создавать доморощенные сценарии, дизайнеру интерфейса и разработчику прикладной бизнес-логи ки вряд ли удастся выполнить свои задачи изолированно друг от друга.

Кроме поиска нужных специалистов необходимо предусмотреть решение еще одной проблемы — тестирования различных вер сий DLL-библиотеки. Создав простое приложение SayHellolSAPI, я сначала обратился по URL-адресу, но затем, перед открытием окна, показанного на рис. 1-3, вспомнил, что забыл расположить по центру текст браузере, как в примере с CCI. Я перекомпили ровал пример и попытался скопировать новую версию поверх в соответствующий каталог, но не тут-то было — я забыл о другом ограничении ISAPI: no умолчанию за гружается в и остается там, пока работает Web-сервер.

То есть, если не остановить сервер, заменить ISAPI-приложение не удастся. Можно потребовать, чтобы не кэ шировались на IIS, и обычно я так делаю на компьютере, на ко тором приложение. Однако, прежде чем выпус вы должны протестировать приложение 14 Глава при выключенном кэшировании, чтобы проверить, нет ли скры тых связанных постоянно инициализированными пере менными, ведь з раунде тестирования DLL загружа лась при каждом запросе.

Помимо замены DLL-библиотеки на рабочем сервере, проблемы возникают при попытке отладки DLL. Разработчики, использую щие MFC, — s частности и те, кто работают в среде Visual C + +, — вообще, привыкли к удобным средствам отладки при созда нии стандартных приложений в среде разработ ки Visual С + Отладка в среде задача решаемая, но это непросто.

Примечание Те программисты, которые специали зируются на и которым нужна и гиб кость и могут восполь зоваться и HTTPmodules.

Лучшее решение: ASP Вы можете спросить, зачем мы говорим об альтернативных ре шениях в книге, посвященной программированию от вет заключается в деталях реализации и его предше ственника ASP. Знакомство с необходимо более глубо кого понимания ASP, а следовательно Еще в бета-версии сервера I1S 2.0, который стал частью Win dows NT 4.0, корпорация Microsoft представила новую техноло гию, которая в то время получила кодовое Тогда Microsoft активно использовала слово «Active» в своих продуктов, и новую технологию в Active Server Pages, или ASP. Вышло несколько версий ASP, наиболее за метные из которых ASP 2.0 с IIS 4,0, в пакет Win dows NT 4.0 Option IIS 4.0), ASP IIS 5.0, денная Windows 2000. Я расскажу об ASP в не ливаясь на особенностях той или версии.

Основные о разработке в Как работает ASP Самые любознательные из вас спросят: а как преобразуются в HTML? Если коротко — с помощью ISAPI, я поподробнее.

Глубоко в недрах IIS показанное ниже диалоговое окно Application Configuration. Оно тем, как обрабаты ваются с различными расширениями, передаваемы ми в URL-адресе. Обратите внимание, что обработки URL-адреса с расширением определена библиотека D GET.POST GET.POST Cancel На следующем снимке экрана показано окно средства Dependency Walker, поставляемого в составе Visual C+ +. В середине правой панели показаны функции, экспортируе мые из ASP.dll. Интересно, что две из них — Version и — это функции, необходимые Есть также необязательная функция которую способны поддерживать ISAPI Глава к.

Возможно, вы ожидали, что реализованы как но, как видно из этого исследования библио теки ASP.dll в составе IIS 5.0, они реализованы с примене нием как просто создать собственную систему, напоминающую ASP. Просто зареги стрируйте расширение, которое вы хотите обрабатывать, и добавьте его в диалоговое окно Application Configuration, a затем DLL-библиотеку которая будет вызы ваться при указании файла с соответствующим расширени ем в URL-адресе. При запросе такого файла функция из созданной библиотеки. DLL библиотеки ISAPI имеют доступ к функциям обратного вы зова, что позволяет им получать всю необходимую для об работки запроса информацию.

Но зачем может создавать собственную DLL библиотеку ISAPI и ее определенному расши рению файла? Это иногда необходимо при особых ниях к сценарию, не удается найти других разумных альтернатив. Или нужно создать похожий на ASP ме ханизм поддержки сценариев на пока еще неподдерживае мом языке. С появлением остается очень немного причин реализовывать другие языки таким способом намного более удобный и мощный способ поддержки новых языков.

Основные сведения о разработке в ASP — это другой тип среды разработки. Во-первых, это среда сценариев. отредактировать страницу и поместить ее в должным образом сконфигурированный каталог с правиль но настроенными разрешениями — после этого ее можно вать из браузера. Во-вторых, ASP-код разрешается перемежать стан дартным HTML (это лишь поначалу кажется удобным, но позже ясняется, что это существенно усложняет разработку).

Примечание Активные серверные страницы (Active Server Pages), уже давно известные как А5Р, к сожа лению, стали совпадения имен: в английс ком аббревиатура «ASP» также используется для услуг приложений (Application Service Providers). Чтобы избежать пута ницы, в этой книге ASP обозначает Active Server Pages, а поставщиков услуг приложений я буду на зывать поставщиками услуг приложений.

ASP-текст обычно пишут на VBScript (Microsoft Visual Basic Scripting Edition), хотя можно использовать и Microsoft JScript.

В листинге 1-3 показан пример ASP-приложения SayHelloASP, со зданного на VBScript <Х Option Explicit Hello ASP </HEAD> <CENTER> Dim x x=1 to & ASP & Next </CENTER> </BODY> Листинг 1-3. Приложение-пример SayHelloASP Результат работы SayHelloASP на рис.</p><p> Глава ASP ASP World World Hello ASP World Hello ASP World Рис. Результат работы приложения SayHelloASP Приложение SayHelloASP чуть «круче» предыдущих примеров SayHelloCGI и SayHellolSAPI — я хотел продемонстрировать ASP. Вместо простого одноразового отображения строки «Hello ASP World» приложение в цикле выводит строку с размером шрифта. Первая строка листинга 1-3 — это директи ва Option Explicit компилятору VBScript. Она требует всех переменных. (Подробнее об этой директиве и последствиях ее применения я расскажу далее, в разделе «Недо статки Директива заключается между парами символов и Они применяются в тексте для обозначе ния сценариев. Сценарии, на стороне клиенте, можно также выделять тэгами и </SCRIPT>.</p><p> В приведенном примере, первых шести строках, содержится стандартный исходный — как в обычном ле. Затем следует с текстом сценария (обозначенный сим волами переменная с именем х, но обратите внимание, что тип не указан. В цикле For значение х увеличива ется от 1 до кроме здесь используется метод Write объек та Response. доступен во всех наряду с несколькими другими объектами, в числе которых Session и Цикл завершает конец которого обозначен символами затем следуют несколько строк обычного HTML-текста.</p><p> For можно записать и так:</p><p> Основные сведения о разработке в а Dim x x = 1 То ASP Next Здесь для вывода пяти версий строки «Hello ASP World» не ис пользуется метод Response. Write. Вместо этого тэг шрифта и сам текст написаны напрямую, в одной строке особого В HTML-тексте группа символов <% =, после которой следует переменная и заверша ющий разделитель — это сокращенное обозначение инст рукции использовать Response для записи значения пере менной в HTML-поток.</p><p> Примечание При отладке такого выражения, как необходимо учитывать некоторые особенности. Сообщение об ошибке, к с ссылается на Response. а не на фактическое выражение. Получив сообщение об ошибке в тексте, который отсутствует в вашем сце нарии, ли в программе соответству ющих сокращений.</p><p> Преимущества ASP Технология ASP мгновенно стала популярной, в значительной сте пени этому способствовала ее способность упрощать задачи, ранее казавшимися сложными (создание динамического Web содержимого). Создавать уж труд но, но работа с ASP намного проще.</p><p> По умолчанию в ASP используется VBScript. Можно без преуве личения сказать, что миллионы разработчиков по мере немного знакомы с Visual Basic, Visual Basic for Applications (VBA) или VBScript. Для них ASP стал именно тем способом, который позволил войти в мир Интернета. Конечно же, они могли бы изу чить новый язык программирования, но в ASP этого не требова 20 Глава лось. Отчасти из-за поддержки VBScript технология ASP стала жизнеспособным создания Web-приложений.</p><p> Также важным фактором оказался относительно доступ к базам данных, осуществляемый посредством Microsoft ActiveX Data Objects При создании динамического информацион ного наполнения информацию нужно где-то брать, и технология ADO позволяла легко извлечь нужные дан ные.</p><p> Наконец, и это, возможно, наиболее важный модель разработки в ASP позволила разработчикам эффективно писать и исполнять программы. Не нужно никакой компиляции или слож ных операций по установке. Как вы узнаете из главы 4, создате ли среды постарались сохранить эту модель разработ ки, даже при том, что внутренние механизмы существенно из менились.</p><p> Недостатки ASP ASP — мощный предназначенный для Web-разработ чиков, создающих крупные масштабируемые Web-приложения.</p><p> ASP с большим успехом использовалась на Web-узлах, таких, как www.microsoft.com и а также на множестве дру гих больших и маленьких сайтов. V меня не было опыта построе ния крупных тем не менее мне пришлось довольно поработать с ASP при создании узла среднего размера — опыт работы с масштабиру емостью реальных Интернет-приложений я приобрел в процес се разработки этого Web-узла, который, по моему мнению, явля ется типичным сайтом среднего уровня.</p><p> Первое, что меня заинтересовало при исследовании возможно сти применения ASP в интрасетях с одним можные издержки VBScript или JScript при каждом запросе, К моему большому ASP-cpega обеспечивала достаточную скорость нескольких заметных исключений).</p><p> На большинстве среднего размера доступ к базе дан ных и обновления являются более критичными местами, чем «движок» ASP. В более поздних версиях ASP повысилась произ предоставления Web-страниц, даже страниц с довольно сложными сценариями.</p><p> Основные сведения о разработке в Почему так медленно выполняются операции со строками в VBScript Я очень много работал с С и С+ + и меньше с Visual Basic, VBA VBScript. Одна из моих самых больших претен к Visual Basic вообще и к VBScript в частности — лютно производительность обработ ки строк. Вот бесхитростный пример на Visual в кото ром в конец строки 50 000 букв «А»:</p><p> Private Sub Dim As String Dim As Long For tloop = 1 To tstr = tstr & "A" Next MsgBox "Done" End Sub На моем компьютере с двумя процессорами Pentium с 400 МГц на выполнение программы уходит око ло 12 секунд. Конечно, это но все равно не дол жно затрачиваться столько времени на добавление симво лов к строке, даже если их 50 000.</p><p> Боб (Bob активно в ствах Microsoft Access и Visual Basic, показал мне лучший соб достичь того же результата.</p><p> Private Sub Dim tstr As String tloop As Long tstr For tloop 1 To tloop, 1) = "A" Next MsgBox "Done" End Sub В программе на том же компьютере та же операция добавления в строку 50 000 символов выполняется мгновен но! Понятно, что проблема не в самой обработке строк, а в 22 Глава выделении памяти них. В программе при каждом из 50 000 вызовов команды tstr = tstr & «А» память под строку tstr повторно.</p><p> Проблема в том, что в VBScript есть функция Mid, но нет оператора который можно было бы ставить слева от знака «равно» ( = }.</p><p> В при подобных операциях со строками произво дительность почти такая же, но уже не удастся в качестве альтернативы воспользоваться классом кото обеспечивает лучшую производительность при работе с большим строк.</p><p> В ASP нет гибкой, мощной и сре ды программирования. Например, в листинге 1-3 при переменной я не определил тип. Я и не мог этого сделать, по тому что переменные в VBScript одного типа — Variant. Пе ременные этого типа способны хранить любые данные, но тип данных не Например, я мог бы написать а затем и это совершенно код. Отсутствие пере менных с точно определенными типами делает программы на VBScript уязвимыми ко всем ошибкам, которых нет в языках со строгим контролем типов.</p><p> Вспомните, что в первой строке примера в листин ге 1 -3 располагается директива Option Explicit, Без нее в VBScript переменные создаются при первом их упоминании. Допустим, в программе есть переменная но вы ошиблись и напи сали (в конце буква а не цифра «1»), VBScript-среда но создаст новую переменную без значения. Отсутствие необ ходимости переменные удобным. В обзорах различных языков сценариев ASP-cpega заслужила дополнитель ные очки за отсутствие контроля типов, но это не соответствует требованиям профессиональных разработчиков, создающим на дежные Web-узлы.</p><p> Другое затруднение заключается в возможности стан дартный HTML и текст сценариев. Точнее — в необходимости размещать команды сценария в HTML. Кроме снижения произ водительности из-за смены контекста при каждом входе и Основные сведения о разработке в ge из раздела сценария, смешанный код в «сыром» HTML чрез усложняет деление на представление и само приложе ние.</p><p> Конкретный пример подобной проблемы — трудности, которые когда я работал над Web-узлом SportSoft созда информационное наполнение для партнерских Web-узлов.</p><p> Партнерство организовано по принципу, похожему на поставку услуг SportSoft Golf предоставляет информационное наполнение, а клиенты размещают на своих Web-узлах ссылки на узел SportSoft Golf. Фактическое местоположение информации не должно интересовать посетителей, и она предоставляется «про зрачно», где бы ни находилась — на сайте клиента или SportSoft Golf. Для выполнения этой задачи информационное наполнение, предоставляемое ассоциацией SportSoft Golf, должно выглядеть так же, как страницы Web-узлов Для подобного трюка, в котором информационное наполнение не отличается от общего вида Web-узлов самых различных кли ентов, требуется разделить представление и содержимое. В прин ципе, для этого можно применить ASP, но сделать это очень трудно. Одно из стандартных в ис пользовании сложной системы ко торые обеспечивают раздельное «подключение» содержимого.</p><p> Одного подключения недостаточно, однако при исполь зовании его совместно со сложным набором переменных, кото рые позволяют ввести в информационное наполнение особенно сти представления, такие, как цвета таблиц и другие, проблему удается решить.</p><p> Поддержка множества подключаемых файлов и неструктуриро совместная поддержка особенностей представления в файлах информационного наполнения и представления ча очень нетривиальная. Эта трудность, на реаль ные и мнимые слабости VBScript, привела к тому, что сложилось довольно прохладное отношение к ASP во многих областях раз работки ПО, особенно среди программистов, C/C+ +.</p><p> 24 Глава Новое решение: ASP.NET В момент совместного ASP версии 3.0 и Windows стало очевидным, что будущее разработки программ тесно свя зано с будущим Web. В качестве части инициативы корпо предстазила новую сохранена модель разработки, которая хорошо знакома и так полюбилась достаточно создать программу и поместить ее нужный каталог с корректными и она будет работать. В ASP.NET представлены новшества, кото рые обеспечивают более простое деление на само приложение и собственно представление.</p><p> В ASP.NET появилось много а существовавшие в «классической» ASP значительно усовершенствованы. ASP.NET это не просто новая версия ASP, а действительно совсем новый продукт, хотя и предоставляет разработчикам которая им так понравилась в ASP. Вот перечень самых важных особенностей ASP.NET.</p><p> • Framework — архитектура, облегчающая проектирова ние традиционных и (В главе 2 приведен краткий обзор Framework.) • Единый язык среды исполнения Language Run time) обеспечивает единый набор сервисов всех языков в ASP.NET. Если вам приходится комбинировать с вы оцените преимущества единого набо ра типов для всех языков. (Подробнее о едином языке среды исполнения — в глазе 2.) • Компилируемые языки. В ASP.NET обеспечивается повышен ная производительность с помощью компилируемых языков.</p><p> Они позволяют разработчику проверить по крайней мере син таксическую корректность исходного текста. В ASP такая воз можность отсутствует, поэтому там простые синтаксические ошибки обнаруживаются при первом выполнении про граммы. (В главе 2 п расскажу о процессе компиляции и уп равляемом коде.) • Замечательные новые языки. Visual Basic это совсем новая версия Visual Basic с новым, более четким синтаксисом.</p><p> Основные сведения о разработке в (произносится как — новый язык, очень похо жий на C + +, но лишенный некоторых опасных которые затрудняют создание надежных приложений на C+ +, Эти два языка доступны уже но со временем появит поддержка других языков — об этом позаботятся сторон ние На момент этих строк появились реализации COBOL и Eiffel для Visual Studio Basic и обсуждаются в главах 3 и 4.) • Visual Studio — новая замечательная среда разработки, которая поддерживает быструю разработку (Rapid Application Development, RAD) серверных приложений. (Подробнее о Visual Studio — в главе 4.) • компоненты. Каркас Framework поддержи вает использование новых типов компонентов, которые очень просто заменять в работающих приложениях. (О создании компонентов для рассказывается в главах 6 и 7.) • Web-формы позволяют программировать в стиле Visual Basic с использованием обработчиков событий в стандартных эле ментах управления HTML. (Web-формы обсуждаются гла ве 5.) • поддержкой XML позволяют разработчикам создавать сервисы и предоставлять доступ к ним по протоко лам, являющимся отраслевым стандартом, о Web сервисах — в главе • ADO.NET. ADO в Framework — новая версия этой тех нологии, которая упрощает доступ из к данным реляционных БД и данных в других форматах, напри мер XML. (XML и ADO.NET обсуждаются в главах 8 и 9.) Заключение Эта краткая история разработки позволит вам лучше разобраться в особенностях Изучение языка про граммирования или среды разработки очень напоминает изуче ние живого иностранного языка. Хотя и книги по син таксису очень полезны, но зачастую требуется знание, хотя бы минимальное, истории страны и народа.</p><p> 26 Глава Если вы в ASP-cpege, многое из материала этой зам уже знакомо, тем не менее, надеюсь, узнали кое что новое об истории появления ASP. Если вы новичок в ASP и материал этой главы пригодится вам при изучении зах ватывающее интересных новых технологий, составляющих NET.</p><p> Глава Runtime Как помните, в 1 я что для доступны два языка сценариев (Visual Basic Scripting Edition) и размещают в каталогах ра (Internet Information Services), настраивают должным образом разрешения, и когда клиент запрашивает страницу, текст сцена рия на странице интерпретируется и клиенту го товая HTML-страница. Подобная модель понятна даже людям, не знакомым с программированием. В отличие от (Internet Server Application Programming Interface) или компонентов текст ASP-страницы можно при необходимости изменять. Клиен ты немедленно видят результаты изменений (если, конечно, не учитывать кэширование страниц на стороне клиента).</p><p> Одно из наиболее значительных улучшений в заключа ется в способе работы с исходным текстом в среде исполнения (runtime). Как я говорил в главе модели разработки в и ASP но скрытые механизмы этих технологий сильно отличаются. В вместо интерпретации исходной страни цы при каждом обращении клиента страница преобразуясь в формат промежуточного языка (Microsoft Intermediate Language) лишь при первом обращении. После ком пиляции страницы в MSIL JiT-компилятор Oust-In-Time преобразует MSIL в машинный код.</p><p> 28 Глава Примечание Можно не ожидать первого запроса страниц а сразу принудительно скомпили ровать все страницы в формат MSIL — это позво лит выявить синтаксические и другие ошибки. Са мый способ компилировать все файлы «за раз» -- создавать приложение в среде Microsoft Visual Studio В этой главе я сначала расскажу о каркасе Framework, а за тем более детально познакомлю вас с языком MSIL и лятором. Далее я как благодаря в NET становится доступной та же модель разработки, что и G ASP. Затем вы познакомитесь с управляемым кодом и данными, в том числе с некоторыми и недостатками ис пользования кода. В заключение я расскажу о не безопасном который выполняется вне среды исполнения CLR.</p><p> Краткий обзор „NET Framework Каркас Framework разработан «с нуля»;</p><p> его задача — пре доставить программистам более эффективную и гибкую среду разработки как традиционных, так и Web-приложений. Одна из наиболее важных особенностей Framework — его способ ность обеспечить «гладкую» совместную работу кода, написанно го на различных На рис. 2-1 показана структура Framework на самом высоком уровне.</p><p> В основе всего каркаса лежат системные сервисы. В реализации это ядро состоит сервисов Win32 API и хотя теоретически уровень абстрагирования можно создавать на основе сервисов любой системы. Традиционно приложения вызывают API-функции системы на прямую. В мире Win32 эту модель весьма трудно реализовать разработчикам, на Visual Basic, так как неко торые API-функции требуют использовать структуры данных, которые легко создаются в но отсутствуют в Visual Basic.</p><p> Управляемый код и Common Language Runtime Basic language specification ASP.NET Windows Web-формы | Web-сервисы Visual -NET Классы Framework Среда Common Runtime Windows Серзисы Рис. 2-1. Архитектура Framework Уровнем выше системных сервисов располагается среда испол Common Language Runtime (CLR). Она загружает и выпол код на любом предназначенном для среды языке. Та кой код управляемым code). о нем я расскажу чуть попозже в Среда исполнения CLR также поддерживает систему пасности. В предыдущих в лучшем случае обеспе чивалась безопасность систем и ресурсов.</p><p> Например, в Microsoft Windows NT и Microsoft Windows 2000 за щита файлов доступна лишь на томах NTFS. Среда исполнения CLR обеспечивает безопасность доступа к коду, что позволяет разработчикам определять разрешения, необходимые для испол нения программы. Во время загрузки и при выполнении методов среда способна определять, разрешено ли предостав коду требуемый доступ. Разработчики могут также явно на значать ограниченные разрешения, например коду, выполняюще му простые и не очень опасные действия, назначать 30 Глава разрешения. Это коренным образом отличается от нынеш ней ситуации, когда VBScript-сценарии беспрепятственно испол няются в почтовых клиентах (например, Microsoft Outlook) и за частую наносят вред. Такую возможность актив но используют создатели вирусов. Даже в защищенной если пользователь с правами администратора неосторожно за пустит зараженный вирусом последнему ста доступными все действия, разрешенные администрато ру. на ролях система безопасности, которую поддер живает среда исполнения позволяет устанавливать разре шения, предоставленные пользователю, в чьем контексте выполняется код.</p><p> Среда исполнения поддерживает работу классов Framework, которые можно вызывать из любого языка програм мирования, поддерживающего Имена классам присваива ются по логичным правилам что облегчает и ускоряет их изучение разработчиками. О библиотеках я расскажу в главе 3;</p><p> они на практически все мыслимые области — от сервисов доступа к данным до органи зации потоков и поддержки сети.</p><p> Поверх библиотеки классов Framework располагаются и XML-данные. — это набор классов, приме няемых в Framework для доступа к данным. бази на спецификации но поддерживает XML и работу в среде.</p><p> выше и XML находится слой поддержки двух различных типов приложений. традиционные кли ентские прикладные программы, в которых используются фор мы Windows [например, создаваемые в Visual Basic с использо ванием библиотеки фундаментальных классов Microsoft тип — в том числе Web-формы и XML Web-сервисы.</p><p> Выше ASP.NET и форм Windows располагается слой специфика ции общего языка (Common Language Specification, CLS) и языков, которые соответствуют CLS — это набор правил, которым должен соответствовать язык. Таким образом гарантируется, что у языков обязательный набор общих ха рактеристик.</p><p> код и среда Common Language Runtime Промежуточный язык Microsoft Intermediate Language Хотя описание работы и Framework часто напоми нает рассказ о работе виртуальной машины Java (Java Virtual Machine, JVM отличаются. Компилятор Java созда ет байт-код, который выполняется во время исполнения JVM-ма шиной. Этот способ немного отличается от принятого в Framework метода, который заключается в создании машинного кода на основании текста на промежуточном языке во время исполнения, но это небольшое различие влечет значительные последствия в плане производительности.</p><p> Использование байт-кода Java действительно ничего нового не представляет. В прошлом такой подход пытались применить в других средах, и обычно это заканчивалось неудачей — частич но из-за недостаточной мощности тогдашних аппаратных средств и отчасти по причине отсутствия то Интернета. Что ко ренным образом отличает Framework, так это код, который не интерпретируется во время исполнения, а преобразуется в «родной» машинный код и напрямую. Одно из пре имуществ Java (которое время от времени раздражает разработ чиков) жесткая система безопасности, поддерживаемая мо дели В Framework же уро вень безопасности наряду с возможностью исполнять «родной» код — при условии, конечно, что у пользователя достаточно прав.</p><p> Существенное преимущество Framework перед Java и JVM выбор программирования. Если вы пользуетесь JVM, у вас одна возможность — Java. Несомненно, Java прекрасный язык программирования, но это один язык. Разработчикам, ко торые привержены Visual Basic или придется потратить вре на изучение модели Java/JVM, a Framework позволяет про граммистам пользоваться любым языком, который им знаком, от Visual Basic и до Eiffel и COBOL.</p><p> Давайте-ка взглянем на программу на Visual Basic Public Module Sub Main() 32 Глава End Sub End Module Сейчас не обращайте на особенности, в более ранних Visual Basic. Задача программы понятна просто вывести в консоль строку «Hello Детали пока не важны — нас вывод. Чтобы скомпилировать эту программу на машине с Framework, необходимо выполнить следующую команду:</p><p> Vbc Примечание В не обязательно как пользоваться компилятором командной строки, осо бенно если вы планируете работать в Visual Studio Однако эти знания позволяют лучше разби что происходит в Visual Studio а также автоматизировать задач.</p><p> В результате получим файл размером около 3 кбайт, который, как я уже говорил, отображает в консоли фразу «Hello Исполняемый состоит из двух частей: первая — это который используется для созда ния машинного кода, а вторая — это метаданные, то есть инфор мация о коде и других элементах, которая требуется среде испол CLR. В составе Framework поставляется программа дизассемблер (lldasm.exe). Если выполнить ее, передав в качестве имя только что созданного файла, вы получите информацию, похожую на показанную на рис. 2-2.</p><noindex> <div class="reklama"> <center> <a rel="nofollow" target="_blank" href="http://www.dobrota.biz/stati/chto-takoe-saentologiya.php" title=""> <table> <tr> <td> <img src="http://www.dobrota.biz/stati/images/scientology.jpeg" border="0" alt="" hspace="30" vspace="20" align="right" width=130 > </td> <td> <font size=+3>Узнайте, что такое Саентология... </font><br><br> <center><font color=red size=+1>Ваша жизнь поменяется...</font><br><br> </center> </td> </tr> </table> </a> </center> </div> </noindex> <p> pubic i Рис. 2-2. Окно утилиты lldasm.exe при анализе приложения HelloDotNet.exe код и среда Common Language Runtime Для нас важен последний элемент в дереве: Main void(). Специ алисты по C/C + + узнают ссылку на void, которая указывает, что это отрезок кода, который не возвращает никакого значения.</p><p> Функция в C/C ++, возвращающая void, полностью аналогична функции Sub Visual Basic. Двойной щелчок рассматриваемого элемента открывает окно, содержащее следующий текст:</p><p> public static void managed instance void = ( 01 00 00 00 ) // Code size 11 (Oxb).maxstack В World!" IL_0005: callvoid } // end of method Даже на зная исходного текста и не владея MSIL, не слишком трудно догадаться, что происходит на самом деле. Строка загружает «Hello строка другую функцию void которая ожидает на входе стро ку. Обратите внимание также на ссылку на — пока вам ничего не остается, как просто поверить мне, что это основная библиотека в Framework.</p><p> Если нажать сочетание клавиш откроется окно с метадан ными программы HelloDotNet.exe (листинг 2-1).</p><p> :</p><p> :</p><p> Global functions Global fields Global # 34 Глава (02000002) Flags: [Public] [Class] [Sealed] [AnsiClass] (00000101) Extends : Method #1 [ENTRYPOINT] Main (06000001) Flags [Public] [Static] (00000016) RVA [Managed] (00000000) [DEFAULT] Void No arguments.</p><p> Type: ОаОООООЗ CustomAttributeName:</p><p> instance void Length: Value : 01 00 00 > < ctor () CustomAttribute (Oc000002) CustomAttribute Oa :: instance void Length: : 01 00 00 > < () TypeRef #1 (01000001) Token: 0x ResolutionScope: 0x (01000002) Token: 0x ResolutionScope: 0x TypeRefName:</p><p> # код и среда Common Language Runtime Member:</p><p> CallCnvntn: [DEFAULT] Void 1 Arguments String TypeRef # Token:</p><p> 0x MemberRef tf Member:.ctor:</p><p> CallCnvntn: [DEFAULT] ReturnType: Void No arguments.</p><p> TypeRef #4 (01000004) Token: 0x ResolutionScope: 0x MemberRef Member: (ОаОООООЗ) CallCnvntn: [DEFAULT] hasThis ReturnType: Void No arguments.</p><p> Assembly Token: 0x Name : HelloDotNet Public Key :</p><p> Hash Algorithm : 0x Major Version: 0x Minor Version: 0x Build Number: 0x Number: 0x Locale:</p><p> Flags : (00000000) AssemblyRef 36 Глава Token: 0x Public Key Token: b7 7a 5c 56 19 34 eO Name:</p><p> Major Version:</p><p> Minor Version: 0x Build Number:</p><p> Revision 0x Locale: <null> Blob:</p><p> Flags: [none] AssemblyRef Token: 0x Public Key Token: bO 3f 5f 7f 11 Oa За Name:</p><p> Major Version: 0x Version: 0x Build Number: 0x Revision Number: 0x Locale: <null> HashValue Blob:</p><p> Flags: [none] User Strings 70000001 : (17) Листинг программы полученные средствами утилиты lldasm.exe что бросается в глаза, — метаданных очень много. Они организованы в таблицы, в которых, по сути, и описано, что оп ределяет и на что ссылается ваш код. Например, #1 — это таблица содержащая информацию о процеду ре которая реализована в коде. В таблице видно, что Main не возвращает никаких Void] и не прини мает никаких аргументов (No TypeRef #2 — это таб лица ссылок;</p><p> она информацию о классе каркаса Framework, на который содержится ссылка в коде.</p><p> Таблица TypeDef #2 также ссылается на метод который не возвращает но принимает один аргумент строкового типа String. Метаданные могут также содержать сведения об и среда Common Language Runtime имени и и сборки, на которые есть ссылки, раз решения безопасности и другую информацию.</p><p> Наверняка вы спросите: зачем нужны все эти метаданные? Во они не от языка кода, а во-вторых, ваша сборка сама себя описывает и позволяет другим средам определять поддерживаемые ею функции. Сборка (assembly) это один или большее число логически связанных кото рые развертываются совместно. По сути, HelloDotNet.exe — это сборка, состоящая из одного Подробнее о сборках я рас скажу в главе 6.</p><p> При проектировании Web-сервисов метаданные обычно приме няются для создания сервисов в формате WSDL (Web services Description Language — язык описания Web сервисов). Подробнее о Web-сервисах рассказано в но если коротко, то Web-сервис программный компонент или сервис, доступ к которому осуществляется через Web. Давайте ка немного забежим посмотрите на рис. 2-3, где пока зана Web-страница, сгенерированная при обраще нии к странице как Web-сервис.</p><p> Рис. 2-3. суммирования двух автоматически сгенерированная Web-сервисом Как видите, Web-сервис содержит метод Add, который, как и следовало ожидать, принимает два аргумента. Введите число «2» 38 Глава в обоих полях Value и щелкните кнопку Invoke. Результат в виде набора в формате XML (рис. 2-4). Более детально с XML и доступом к данным вы познакомитесь в глазе 8.</p><p> -:' ••• •. г •:</p><p> oat Рис. Результат вызова метода Add на рис. 2- Информация, полученная из метаданных, позволяет потенциаль ным пользователям определять обязательные параметры и тировать Web-сервис без создания каких бы то ни было тесто вых каркасов. Важность этой возможности существенно возра стает, когда Web-сервисы становятся стандартным методом пре доставления функций в Web.</p><p> Примечание Вообще возможность «ви деть» детали кода, основанного на Framework, является большим преимуществом. Однако с этим могут не согласиться которые созда ют двоичные программы для выполнения на рабо чих станциях клиентов, а не или Web сервисы. На момент написания этих строк не су ществует признанного способа скрыть эту инфор мацию, хотя в теории ничто не может запретить скрывать подобные данные. можно методу («получить секретный код») за путанное название, допустим чтобы сделать его менее заметным без ущерба для работы среды исполнения, осуществляющей про верку, связанную с Подобное «запутыва ние» используется для сокрытия кода клиентских сценариев Jscript, а также исходных текстов на С, ко торые предоставляются клиентам. К счастью, разра ботчикам, создающим приложения не при дется прибегать к подобным ухищрениям.</p><p> Управляемый код и среда Common Runtime Компиляция «Just in Time» Теоретически, как и в Java, код на языке можно скомпили ровать и исполнять на любой платформе, которая поддерживает среду CLR. На такая среда суще ствует в архитектуре Intel с ОС но веро ятно, что она появится и на других платформах. Такая уверен ность на наличии JIT-компилятора Oust in Time). На рис. 2-5 показаны процессы компиляции и исполнения.</p><p> КОМПИЛЯЦИЯ Исполнение Рис. 2-5. Компиляция и исполнение управляемого кода Можно что компиляция такого ассемблерного кода, как должна сказываться на производительности приложения, На самом деле дополнительные издержки очень малы и практи чески незаметны. Отчасти это, конечно же, умени ем разработчиков но в основном такое поведе ние — результат механизма, по которому работают программы.</p><p> Вообще говоря, при работе программы исполняется далеко не каждая ее строка. Например, код обработки ошибок выполняет ся лишь в исключительных случаях. Чтобы воспользоваться этим фактом и не компилировать с самого начала в машинный, компилирует код лишь по мере необ а откомпилированный код для повторного использования. довольно прямолинеен.</p><p> При загрузке класса загрузчик «закрывает» заглушками все ме тоды класса. Когда метод вызывается в раз, код заглуш ки передает управление который преобразует в машинный код. Затем заглушка заменяется на ука затель на созданный машинный код, и последующие запросы вы полняются непосредственно этим кодом.</p><p> 40 Глава код и данные Так что же собой управляемый код? Управляемый код (managed code) — это тот, который среде ис полнения CLR достаточно информации для выполнения следую щих задач:</p><p> • поиска описывающих метод, по адресу в коде;</p><p> • прохода стека;</p><p> • обработки исключений;</p><p> • хранения и поиска информации, связанной с безопасностью.</p><p> Чтобы выполнение всех этих задач стало возможным, код дол жен предварительно пройти специальную проверку, или верифи кацию (verification если только политикой не разрешено его исполнение без В процессе верификации исследует и метаданные, пытаясь выяснить, ли контроль типов. Код с типов обращается только к областям которые ему принадле жат, — это гарантирует его корректную работу и правильное имодействие с другими а также то, что он не ста нет причиной или злонамеренного разрушения сис темы. В отсутствие контроля типов нельзя четко соблюсти пра вила безопасности.</p><p> С управляемым кодом связаны данные (managed data) память для которых выделяется и освобождается автоматически средой с применением механизма, который называется «сборка мусора» (garbage Кроме прочего, последний отвечает за освобождение памяти, выделенной там, которые вышли из области видимости.</p><p> Одно из использования «сборки мусора» заключа ется в что в принципе нельзя определить время и даже по рядок разрушения объектов. Посмотрите на следующий исход ный текст на С#. (О я расскажу в главе 3, но для понимания этого фрагмента особые знания не требуются.) class { public static void { System. String Hello "Hello";</p><p> World код и среда Common Language Runtime System.</p><p> Здесь создаются два объекта строкового String: один содер жит строку «Hello» и второй — Хотя строки созданы именно в этом порядке, ничего нельзя сказать о порядке, в кото ром они будут уничтожены. Более того, мы даже не можем ска зать, будут ли они немедленно разрушены при выходе из области В этом примере порядок или время уничтожения не имеют но в других случаях это бывает существенно.</p><p> не поддающееся прогнозу освобождение объектами, не вызывает проблем, пока объект не зан с постоянными ресурсами, которыми среда исполнения CLR управлять не в состоянии, например подключениями к базе дан ных или описателями окон. В этом случае необходимо создать ме тод Dispose и реализовать интерфейс которые сле дует явно вызывать для освобождения ресурсов. Примеры при менения этой методики приводятся в главах.</p><p> О небезопасном коде Существуют ситуации, которых не удается управляемым кодом. Например, для многих встроенных Win32 требуются указатели. С отсутствием указателей в Visual Basic сталкиваются программисты, пишущие на C/C++. В Visual Basic указателей также нет, но здесь поддерживается ана механизм, он ссылочный тип (reference type). Я считаю, что в некоторых случаях указатели все же более удобны. Иногда требуется использовать неуправляемый унасле дованный код. Управляемый код массу преиму ществ, и наверняка нам бы хотелось, чтобы все имеющиеся про граммы волшебным образом превратились в управляемый код, но иногда это просто невозможно. Так как же когда без указателя или унаследованного кода никак не обойтись? Для таких случаев в С# предусмотрено специальное ключевое сло во — unsafe Метод или отрезок программы, объявленный небезопасным и скомпилированный с ключом преобразуется небезопасный (не код, ко 42 Глава не процедуре верификации в среде испол Кроме unsafe в есть ключевое fixed. В процессе «сбор ки мусора» переменные часто перемещаются — это позволяет более эффективно использовать память. Например, когда требу ется выделить память для большого а свободная память доступна в виде нескольких мелких механизм «сборки мусора» часто предварительно перемещает блоки, освобождая область побольше. Понятно, что такая ся катастрофой для программы с небезопасным кодом, где ис пользуется указатель на одну из перемещенных «сборщиком му сора» переменных. Ключевое слово fixed создано именно для та ких ситуаций. В блоке, обозначенном словом все перемен ные закрепляются, и их запрещено перемещать. После выхода из блока fixed переменные снова поступают s распоряжение ме ханизма «сбора мусора».</p><p> Заключение ASP-программистам редко приходится разбираться в особенно стях API-интерфейса Win32, лежащего в ASP на вере. В самом деле VBScript и JScript предоставляли очень огра ниченные возможности выполнения того, что выходило за пре делы «компетенции» языка.</p><p> С другой стороны, программистам, работающим в среде полный доступ ко всем богатым Framework. Языки и Visual Basic совместно с карка сом Framework позволяют разработчикам делать практичес ки что доступно программистам, пишущим программы с использованием Win32.</p><p> Глава В время при разработке реальных систем приходит ся решать две важные проблемы — обеспечение работы созда программы на нескольких платформах и взаимодействие частей приложения, написанных на разных языках. Как вы узна ете из Framework предлагает элегантные реше ния обеих проблем. Но сначала — небольшой экскурс в историю, Попытка решения проблемы многоплатформенных приложений была предпринята при создании языка программирования Java корпорацией Sun Microsystems. Для Java-программ на компьютере устанавливается Java Virtual Machine, JVM). Во время исполнения программы она интерпре тирует на Java. Поскольку такие виртуальные машины распространяются з составе браузеров для различных платформ, иногда что Java позволила частично решить проблему.</p><p> Но в часто наблюдается несовместимость даже при исполнении на платформе. Недавно в одной Java-программе я применял переключатели без надписей.</p><p> Для этого в качестве текста надписи я задал пустую строку. В общем случае это позволило решить задачу, но при выборе та кого переключателя в Microsoft Internet Explorer на месте текста появлялся небольшой пунктирный прямоугольник. Казалось, не поладку устранить просто: вместо строки явно присвоить свойству «текст» значение null. Это работало до поры до времени, но с выходом новой версии Netscape Navigator присвоение не только перестало работать, но приводило к аварийному завершению работы браузера. При этом сообщалось 44 Глава об ошибке в исходном коде на С + Такова межплатформенная совместимость в Java.</p><p> На заре эры персональных компьютеров проблема межплатфор менной еще острее. Для всего этого раз различных моделей ПК и платформ в значительной степени требовалась единая среда разработки. Кое-какие новше ства позволили свести эту проблему к минимуму. Прежде ассемблерный код Intel x86 стал ближе к универсальному языку ассемблера. Практически во всех нынешних приложениях предус матривается исполнение на компьютере. И даже на других аппаратных платформах, в особенности Apple Macintosh, разрабатывается среда для исполнения мых программ.</p><p> Вторым важным изменением, повлиявшим на решение пробле мы межплатформенной совместимости, стало бурное развитие Интернета. Интернет предоставляет единую платформу, позво ляющую приложениям на различных платформах взаимодейство друг с другом, и оборудование, такое, как беспро не исключение. HTML и JavaScript обеспечи на стороне клиента достаточно функциональную рабочую среду. Конечно, в результате Интернет-бума возросли требова ния к перекрестной совместимости программ на различных плат формах — это особенно верно в отношении создания сложного пользовательского интерфейса на стороне клиента;</p><p> эту нишу заполнил Java.</p><p> Как я уже говорил в начале главы, вторая с которой сталкиваются разработчики программного обеспечения, — частей приложения, написанных на разных языках.</p><p> В настоящее время на доминирующей платформе soft Windows на системах) доступно большин ство технологий и программирования. Наиболее популяр ные Microsoft Visual Basic, C/C + + и Borland Delphi. Менее рас пространены, но активно применяются COBOL, Fortran и PERL.</p><p> С первый дней Windows существовала возможность вызова ди библиотек (dynamic-link library, DLL) практически из любой среды разработки, но это не всегда дава лось легко. Например, простая передача строки в качестве па раметра, иногда вызывала значительные затруднения. В боль Объекты и языки Framework программирования перед передачей строки сле дует позаботиться о выделении достаточного места в памяти. В некоторых средах разработки программисты этого не делают, Visual Basic берет управление строками на себя, и передаче строки в другую функцию по ссылке можно добавлять в нее сколько угодно информации, не заботясь о про странства. Еще хуже обстоят дела с пользовательскими типами данных. Один недавний пример: способ, с помощью которого Visual Basic заполнял переменные-члены таких типов, вызывал хаос з программах.</p><p> В последние годы связующим звеном между компонентами, на писанными на различных языках, стала технология СОМ. Она решает проблему унификации типов данных, но никак не реша ет проблем с программированием Win32 API. Для применения Win32 в Visual Basic требуется создавать очень нехарактерные для этого языка структуры данных. Сложности также часто воз никают при программировании на уровне Win32 API в других языках. Строковый тип поддерживаемый СОМ, не очень то рассчитан на С и C+ +.</p><p> Эти проблемы решены в Framework. Во-первых, в нем пред ставлена система типов данных, которые легко между языками без потери точности. В Framework раз работчикам больше не придется беспокоиться о том, на ка ком языке написана программа, использующая создаваемый ими класс или компонент. Они смогут больше времени уделять реше нию основной задачи и меньше тратить на оценку того, каким образом созданный на C++ клиент программы будет строку или денежный тип данных.</p><p> Во-вторых, Framework предоставляет виртуальную среду исполнения, которая решает задачу переносимости без ущерба для производительности. Приложения, созданные на платформе прекрасно работают на любой платформе. О том, как это происходит, я расскажу чуть позже.</p><p> Решение проблемы совместимости типов Отличительной чертой любой большой программной среды яв ляется хорошо продуманная модель. Очень трудно 46 Глава исправлять ошибки в нагромождении плохо спроектированных объектов и при этом программы мирового класса. Хо рошую модель легко расширить собственным кодом, объектной в Framework поддер живаемая на уровне каркаса система типов.</p><p> Сейчас, как мне кажется, самое время уточнить некоторые тер мины. Говоря о я имею в виду что в ней предполагается хранить. Например, нельзя присвоить перемен ной целого типа значение «dog» или «Fred», а в переменной с ти пом «дата» значение вполне разумно, а 7 — нет.</p><p> работающим с классической технологией ASP (Active Server Pages), различные типы переменных довольно не так как в языках этой технологи переменные од ного типа — Variant. Другими словами, в строке програм мы переменная может иметь значение а на следующей «Fred». Многим начинающим программистам единственный тип данных кажется удобным, однако их более опытные коллеги зна ют, что такая «вольница» приводит к путанице. Несмотря на то, что явное преобразование переменных между типами требует определенных усилий, оно позволяет корректность преобразования.</p><p> На рис. 3-1 показана взаимосвязь между различными типами, поддерживаемыми Framework. Одни из них, вероятно, вам уже знакомы, происхождение других требует понимания некото рых сравнительно новых таких, как и сопос тавление размерных типов и ссылочных типов. Я объясню новые понятия, относящиеся к типам Framework.</p><p> Объекты и языки Framework Типы Указатели интерфейсы размерные типы Упаковочные Делегаты ские классы Рис. Система типов Framework Размерные типы Размерные типы (value type) — это небольшие по объему данные, которые в виде последовательно сти битов. Например, в языках + и Visual Basic 6.0 есть типы и long — они для представления чисел и обычно используются в большинстве в любой программе.</p><p> Примечание Один из системы типов в языках программирования Visual Studio 6.0 ее недостаточная логичность и Например, представьте мое когда я об наружил, что на прекрасно работавшей до этого произошел очень серьезный сбой.</p><p> об ошибке указывало на переполнение переменной. После проверки причина ошибка ста ла очевидной значение поля идентификатора пользователя в системе превысило предел числа в Visual Basic, и вызов функции привел к аварии. Такому опытному работающему с C/C + как не составило труда разобраться в случившемся. В мире Win32-uHTep 411 Глава nog тип в C/C + + отводится 4 бай та, а в Visual Basic: 6.0 - - только 2. Единый набор типов в Framework позволит снизить вероят ность возникновения подобной ситуации.</p><p> В таблице 3-1 перечислены некоторые встроенные размерные типы в Framework и указана их совместимость со (Common Language Specification, CLS).</p><p> Таблица 3-1. Некоторые размерные типы B.NET Framework Имя класса Совместимость Описание с CLS Да 8-битное целое без знака System. Нет 8-битное целое со знаком System. 6 целое со знаком Да 2 Да 32-битное целое со знаком Да 64-битное целое со знаком System. Нет целое без знака Нет 32-битное целое без знака Нет 64-битное целое без знака 32-битное число с Да 64-битное число с плавающей точкой Да Значение true или false Да 16-битный символ в формате Unicode Да 96-битное десятичное число System. In tPtr Да со знаком, зависит от платформы System. Нет без знака, зависит от платформы Да Корневой Да Строка фиксированной длины, состоящая из символов в фор мате Unicode Объекты и Framework Примечание В Visual Basic недопустимо использовать тип а также любой целый тип без знака или Ссылка на эти типы данных вызыва ет ошибку. В подобных ограничений но для максимальной межъязыковой совместимости реко мендуется не применять указанные типы, кроме тех когда без них ну никак не обойтись. В Visual Basic меньше проблем с беззнаковыми типами данных из-за большего числа мых под переменные типа Все на соответствуют значениям ти WORD 32 DWORD В при работе с языками, поддерживаемыми значения не используются. Например, тип который Конечно, вы вправе вместо но это неразумно, так как исходный текст сложнее Использова ние полных имен типов данных System оправдано в особых ситуациях. Если создаете компоненты для коммерческого рас пространения, лучше указывать используемые типы, потому что в других реализациях языка указанные вами типы могут не Ссылочные типы Переменные ссылочного типа (reference type) на мес тоположение той или последовательности битов. Фактичес ки они хранят ссылки на сами данные. Во многом эти типы напоминают указатели на данные, которые хранятся в куче сре ды исполнения CLR и доступны только по ссылке. Запомните, что прямой доступ к основным данным недопустим;</p><p> это нужно для того, чтобы «сборщик мусора» мог отслеживать активные ссыл ки и удалять данные после всех ссылок.</p><p> из возможных проблем с моделями, такими, как Framework, заключается в дополнитель ных расходах ресурсов. В частности, все Framework являются производными от базового В табли 3-2 перечислены методы объекта Глава Таблица 3-2. Методы Метод Описание Возвращает если тем же са мым экземпляром, что и при Equals no Этот метод разрешается переназ начать для проверки тождества со значением true, если ObjA и ObjB — это один и тот же Finalize Защищенный метод, вызываемый для осво бождения ресурсов перед «сборкой мусора». Реализация по умолчанию пуста, В С# вместо Finalize лучше использовать де хеш-функцией конкретного типа, применяется в и структурах поддерживающих хеширование GetType Возвращает обьект класса метаданные, к метод которого вызван Защищенный метод, предоставляющий плос кую копию объекта. Плоская копия только содержимое текущего без ссылок на другие объекты New Метод создания объекта в Visual Basic Метод создания объекта в Возвращает если ObjA и ObjB один и тот же экземпляр или оба пусты, то есть равны null Возвращает строку, представляющую объект, Например, для целого типа возвращается зна чение на то, что System.Object относительно легким наличие у каждого целого чис ла способно отрицательно сказаться на производительности.</p><p> что вместо обычных целых чисел у вас огромный массив таких чисел, каждое из которых в собственном объекте. В таких условиях работать было бы невоз можно.</p><p> три ссылочных типа.</p><p> Объекты и языки Framework • Самоописываемые типы — тип такого типа мож но определить по ее значению. типы под разделяются на классы и Как и большинство клас сов в других языках и каркасах, класс в Framework ется контейнером свойств и объекта. Классы делят ся на пользовательские классы, упаковочные типы и делегаты.</p><p> • Интерфейс упаковывать описания набора функций.</p><p> • ссылается на значение, указывающее на другой Значение этого типа не является объектом, поэтому по такому значению нельзя точно определить тип. пони мания большей части исходного текста в этой книге глубокие знания указателей не требуются.) Перечисленные типы не связаны с каким-то конкретным языком — Visual Basic и в определен синтаксис для поддержки каждого из этих ссылочных типов.</p><p> Встроенные ссылочные типы Одним из встроенных ссылочных типов в Visual Basic и С# класс Object (в его название пишется строчными object). Оба типа базируются на описанном ранее типе Sys Типы со значениями можно применять во множестве ситуаций, они позволяют эффективно использовать ресурсы. Что произой если требуется работать с таким как объект? Напри метод часто используют для отладки. идет об упаковке (boxing) переменных.</p><p> Допустим, у вас переменная типа и требуется совершить какое-то действие с ее строковым представлением. Взгляните на такой фрагмент кода.</p><p> using System;</p><p> class { static void { int i=5;</p><p> object System.</p><p> 52 Глава System. Console.</p><p> System. Console.</p><p> System. Console. Line Сначала мы присваиваем целой 5. Затем объект box и присваиваем ему значение В этой стро ке простого размерного типа в объект, который ссылается на переменную ссылочного типа - почему этот процесс называется упаковка (boxing). На следу ющей строке выполняется вывод в консоль (с при менением метода где — это метод объекта, В результате получаем то, что и ожидали: в кон соли отображается число 5.</p><p> Немного странно, что следующая строка также отображает в консоли число 5. Здесь объект явно не однако вызов метода объекта срабатывает, давая ожидаемый результат.</p><p> Это возможно благодаря упаковке размерных типов (в данном слу чае в объекты в. NET Framework. Таким образом, метод вызывается для упакованной версии целой пе ременной.</p><p> Тот же принцип используется в двух последующих строках кода отображения типа объекта с помощью объектного метода Обратите внимание, что и явно упакованная версия в объекте box, и созданная «на лету» упакованная версия соответствуют типу Ни один из рассмотренных методов обычно не используется (разве что для отладки), но сама возможность создавать объект, ссылку на любые другие типы, очень полезна.</p><p> размерных типов означает создание копии упаковыва емого значения. Например, если добавить в рассматриваемый фрагмент кода такие строки:</p><p> System. Console.</p><p> Первая строка (она на ту копию переменной кото рая применялась в первом отобразит в консоли 5, но вторая строка (она ссылается на упакованную копию перемен Объекты и языки Framework обратится к новому значению и поэтому з консоли ото бразится число 12. Причина в том, что упаковке подвергается размерный тип.</p><p> С стороны, при ссылочного типа объект ссыла ется на сам а не на его копию.</p><p> System;</p><p> class :</p><p> public int i;</p><p> class test{ static void Main() object box;</p><p> intHolder ih = System.</p><p> Оба отобразят в консоли чис ло 99, потому что box теперь ссылается на переменную ссылоч ного типа intHolder, а не на ее копию. Если intHolder объявить не а как struct, то первая строка кода выведет в консоль 22, потому что з этом случае значение копии переменной ih до ее упаковки в объект box.</p><p> Примечание В этих примерах используется но эти же принципы применимы ко всем языкам Класс присутствующий как в Visual Basic так и в предоставляет все необходимые возможности для обработки строк. Не менее важно то, что методы идентичны в обоих языках, Это же требование ко всем языкам, которые будет поддерживать В следующем фрагмент кода демонстрируют ся лишь некоторые возможности класса String.</p><p> 54 Глава Public Module Sub Dim s as String Dim i as integer is a test & & End Sub End module В процессе исполнения небольшой программы з консоль следующее;</p><p> This is a | This is a I Сначала создается и выводится в консоль строка с несколькими пробелами в конце. Далее метод Trim, и теперь стро ка без пробелов между словом test и чертой. После этого мы присваиваем переменой s значение рав ное строке «46». Обратите что при этом старая строка («This is a test») осталась вместо этого создана копия.</p><p> Строки — после создания их нельзя изменить напря мую. Если удобнее напрямую изменить существующую строку, а не создавать новую копию, рекомендуется класс Применение этого класса при каждом изменении строки наиболее когда требуется выполнить изменений в большой строке. В противном случае многократное выделение и освобождение большого блока памяти могут отрица тельно сказаться на производительности. В конце строка приво дится к типу суммируется с другим целочисленным значе нием, и полученный результат отображается в консоли.</p><p> Большинство VB-программистов привыкли работать со строка ми именно так — присваивать значения переменным полагаясь на системную поддержку таких операций, как удале Объекты и языки Framework ние и/или замыкающих пробелов. Однако в C/C + все по-другому (несмотря на то, что многие программисты, работа ющие с C+ +, используют строковые классы библиотеки Standard Template Library и поэтому знакомы с подобными приемами).</p><p> По сути, подобный код можно написать на и что не менее важно, в этом случае при передаче строк между языками не затруднений, возможных при использовании тра диционных платформы Win32. В процессе работы с раз личными языками программирования на этой платформе, я об наружил как минимум три разновидности строк:</p><p> • строка с замыкающим нулем, очень часто применя ется при программировании для Win32 и на C/C++;</p><p> • строка Basic, или очень часто применяется в Visual Basic и COM;</p><p> • строка с который хранит значение длины.</p><p> Сама строка следует после этого Такие строки очень в Pascal.</p><p> Можно также о строках с замыкающим нулем, состо ящих из символов (Unicode). В Framework пре дусмотрен стандарт для хранения строк.</p><p> Классы Framework В Framework сотни классов, позволяющих делать то, для чего раньше требовалось прибегать к API-интерфей са Win32. В таблице 3-3 перечислены некоторые классы и пре доставляемые ими возможности.</p><p> Таблица Некоторые классы Framework Описание Операции с реестром System Поддержка массивов, том числе поиск и сор тировка Поддержка работы с наборами. Включает та кие работу с данными классы, как и Stack Доступ к данным, поддержку (более подробно ADO.NET рассмат в 8) (см. стр.) Глава Таблица 3-3. (продолжение) Объект Описание работы с датами и временем Diagnostics Поддержка журналов событий и отла дочных а также получения инфор мации о процессе System. Net Поддержка работы с DNS (Domain Name System), cookies, Web-запросами и ответами Sockets Поддержка сокетов TCP/IP. Механизм похож на в Win32, но более четко организован Reflection Поддержка просмотра загру женных типов и методов, а также создания и вызова типов Threading Создание и управление множественными потоками Поддержка элементов управления и в Web-приложениях Поддержка XML, том числе спецификации DOM (Document Object Model) уров ня 2 и протокола SOAP (Simple Object Access Protocol) версии 1. которых все еще необходим API-интерфейс Win Несмотря на достаточно богатьш выбор Framework, остались области, в которых приходится «спус каться» на Win32. про ецируемые в файлы (memory mapped в Framework в момент напрямую не поддер живаются. позволяют легко организовать со вместный доступ к данным из нескольких приложений. Я использовал такие файлы для взаимодействия написанных на C + + и на Borland Delphi. В обоих языках запись и чтение по которому выполнялось так же, как и в обычном указателе в памяти.</p><p> Как в Visual Basic так в предусмотрена возмож вызова Win32 API, как и дру гой стандартной динамически подключаемой библиотеки.</p><p> Объекты и языки Framework В таблице 3-3 упомянуты некоторые возможности классов Framework. До сих пор некоторые из представленных воз можностей не поддерживались даже в стандартной среде Win (например, поддержка XML). Способ поддержки других вещей, например управление потоками, претерпел существенные изме нения. для работы с потоками позволяют программис там, пишущим на Visual Basic, безопасно распределять исполне ние программы между несколькими потоками. Поскольку эти объекты исполняются в управляемом контексте, они предостав ляют все преимущества управляемого кода (безопасность и на дежность) — программист может сосредоточиться на особенно стях своей программы, что действительно необходимо при созда нии мощных приложений.</p><noindex> <div class="reklama"> <center> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- dissers - kvadr (text2) --> <ins class="adsbygoogle" style="display:inline-block;width:336px;height:280px" data-ad-client="ca-pub-9894471784993021" data-ad-slot="6763398730"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </div> </noindex><p> Основные сведения о Visual Basic Редко компании масштаба Microsoft рискуют своими флагманс кими продуктами, как это сделала Microsoft, выпустив Basic В Visual Basic в основном сохранилась та легкость программирования, которая и сделала Visual Basic популярным, однако в этой среде перестают работать практически все суще ствующие программы. Более того, программистам, работающим с ASP и использующим VBScript (Visual Basic Scripting Edition), при дется подучиться, чтобы воспользоваться всеми преимущества ми Visual Basic Изменения в Visual Basic заставят закрыть рот критиков, которые пренебрежительно Visual Basic «игрушечным» языком.</p><p> Больше всего у не любящих Visual Basic, вызывала обработка ошибок. Иногда принятую в Visual Basic об работку ошибок называют «On Error Goto («При ошибке идти к Обработку ошибок в Visual Basic можно настроить как надо, но на практике сделать это корректно очень трудно, и час то она работает из рук вон плохо. В VBScript обработка ошибок еще больше ограничена, и это программистов, работающих с ASP. Изменения в обработке ошибок — всего лишь одна из нескольких Visual Basic, которая существенно улучшена в Visual Basic. N ЕТ, хотя и ценой утраты совместимости с существующими программами.</p><p> 58 Глава Старье — на помойку!</p><p> Во многих отношениях Visual Basic стал собственного успеха. Существует шутка на тему, почему бог создал мир всего за семь ему не нужно было к уже суще ствующей платформе. Я эту шутку оценят члены коман ды в Microsoft, которая занимается разработкой Visual Basic.</p><p> Внесение изменений в базовую среду разработки для многих Windows-программистов — дело тонкое. В каждую новую версию привносились новые особенности, но при этом обеспечивалась под держка старого кода. В Visual Basic эту традицию сломали.</p><p> несколько причин таких коренных перемен. Самая важная из них заключается в том, что базовой платформой для программ на Visual Basic не Win32, a Framework. Одно это потребовало множества изменений. В Framework поддер живается старый механизм обработки исключений типа «On Error Goto», однако, его, вы не сможете в полной мере ис пользовать возможности нового каркаса. Прежде чем поговорить о новых особенностях, я расскажу о двух самых важных отличи ях между Visual Basic 6.0 и Basic — операторе Set и стандартных соглашениях о Оператор Set уходит в прошлое Ключевое слово Set и его использование часто приводили в за новичков от Visual Basic. Например, когда требо валось создать экземпляр элемента управления ActiveX со свой ством ProgID обычно писали такой код:</p><p> Dim As Set foo = Создание требует использовать слово Set. К сожалению, многие разработчики не до конца понимают, что кое объект с точки зрения Visual Basic. Я знаю не одного програм миста, который возился Set в тщетных попытках заставить свою программу работать. Иногда она начинала работать, поскольку проблема на самом деле заключалась в наличии или отсутствии Set, но часто причина оставалась и обнару живалась лишь при внимательном просмотре исходного текста.</p><p> Зачем вообще требуется Set? В Visual Basic 6.0 и в более ранних версиях объекты имели по умолчанию, для которых не Объекты и языки Framework требовался параметр. Если у есть кое по умолчанию bar, то в отсутствие иногда воз никает двусмысленность, как в этом коде:</p><p> Dim f as foo Dim о as Object В данном случае кому присвоить значение foo.bar или foo. В Visual Basic необходимость использования Set ликвидирована за счет отмены внепараметрических по умолчанию. Более того, слово Set в Visual Basic запрещено.</p><p> Стандартные соглашения о вызове параметров особенностью, которая потребует важных доработок ис ходного текста при переходе на Visual Basic можно считать изменения в способе передачи параметров в функции и проце дуры. В предыдущих версиях Visual Basic передача всех парамет ров по умолчанию выполнялась по ссылке, то есть копия параметра не создавалась, а передавался указатель на место пе редаваемого параметра в памяти. Взгляните на такой фрагмент кода на Visual Basic 6.0:</p><p> Private Sub Dim 1 As Long Dim As Long Dim t As 1 = = t = "1 was " & & but is now & End Sub Function As Long) As Integer Ref = Ref = Ref End Function Выполнив эту программу в любое время (после полуночи), мы получим два различных значения (рис.</p><p> 60 Глава Рис. 3-2. Диалоговое окно с сообщением при вызове Возможность изменения чаще всего полезной, но иногда она приводит з новичков, Например, взглянув на этот исходный текст, не заметит между / и перемен ной Ref в функции Конечно, Visual Basic 6.0 и в более ранних версиях можно явно указать, что параметр передается по значению. Вот на Visual Basic 6.0, в которой выполняется вызов по значению:</p><p> Function Ref As Long) As Integer Ref = Ref Mod CallingByValue = Ref End Function В этом случае значение переменной / останется неизменным (рис. 3-3).</p><p> Рис. Диалоговое окно с сообщением при вызове CallingByValue Считается хорошим тоном явно объявлять о зе — это позволяет избежать неприятных ситуаций. Это и есть стандарт для всех будущих программ на Visual Basic Примечание Если параметр достаточно передача по оказывается более эффектив даже если функция не изменяет значение па раметра.</p><p> Объекты и языки Framework Дорогу новому!</p><p> Отказ от поддержки старых программ станет самым большим откровением, Visual Basic но намно го важнее улучшения в самом языке. Проблемы с совместимос тью это временная а выгода от новых возможнос тей будет ощущаться еще долго. потрясут основы «мироздания» тех кто привык к ограничениям работы VBScript в ASP.</p><p> Наследование и В последних версиях из Visual Basic с переменным успехом пыта лись сделать язык. Чтобы называться объектно-ориентированным, должен отвечать трем основ ным Во-первых, поддерживать то есть метод объекта зависит от типа самого та, во-вторых, поддерживать инкапсуляцию, то есть наличие четкого разделения между представлением объекта и особенно стями его внутренней структуры. Например, если объект на вы ходе дает набор строк, то детали внутренней реализации недо ступны, то есть нельзя узнать хранится ли набор в массиве, свя занном списке или стеке. Наиболее же важным требованием яв ляется наследование — возможность получения одного типа из другого. Например, имея простой класс:</p><p> Public Class Base Public Function foo End Function End Class можно создать класс-потомок:</p><p> Public Class Derived Inherits Base Public Function bar rived End Function End Class Если создать экземпляр класса Derived и вызвать функцию foo, в консоли отобразится текст «Base Foo».</p><p> 62 Глава удобно при повторном кода. Это намного лучше, чем применение такой прошлом операции «вырезать и нужно создать набор фигуры. V фигур характеристики, такие, как местоположение, длина и ширина, и операции, над фигурами, например и Move Наследование позво создать иерархию фигур, изначально полученных из класса форма которого выглядит так:</p><p> Class Shape Private as Integer Private as Integer Public Sub myX = myY End Sub Public Property X Get X = myX End Get Set myX = Value End Set End Property Public Property Y Get Y myY End Get Set myY = Value End Set End Property Function End Class Class Square Inherits Shape Overrides Function ' Здесь метода Draw ' класса (квадрат) End Function End Class Объекты и Framework В этом простом примере при создании s класса Square свойства s.X вызовет метод Set этого свой ства, как определено в классе Shape, а затем вызовет метод Draw класса Square. Более того, если 5, основанный на классе передается методу, который воспринимает Shape в качестве параметра, и оттуда вызывается метод то вы зывается метод Draw именно Square.</p><p> Классы с одним и тем же именем могут вести себя по-разному.</p><p> Способность языка определить, как поведет себя класс в зави симости от типа объекта, полиморфизмом, Несколько слов о множественном наследовании Visual Basic не поддерживает множественное наследова ние — в классе можно использовать только одно ключевое сло во В некоторых объектных моделях (особенно в C + ) множественное наследование используется как способ получения объектов, наследующих нескольким классам, например объект Dog (собака) может наследовать одновременно и Animal ное) и Pet Единичное наследование не та кая уж и трагедия, кроме того, оно предотвращает появление двусмысленности методов. Например, если Dog наследует клас сам Animal и Pet и в обеих иерархиях присутствует метод Make Noise (гавкать, шуметь), возникает двусмысленность: метод ка кого класса вызывать.</p><p> Есть много способов обойти ограничение единичного наследова ния. В данном Animal можно определить как базовый класс, Pet реализовать как класс-наследник Animal, a Dog — как наследник Pet. Это не множественное наследование, так как на каждом уровне только одно ключевое слово Inherits.</p><p> [Такое решение непригодно для класса (любимый каме поскольку Pet Rock можно считать домашним но это не животное].</p><p> Другое решение — создать класс Animal и его потомок Dog, a затем в последнем интерфейс Pet. Интерфейс по хож на класс за исключением того, что он содержит только ме тоды, и эти методы не реализуются на уровне Реа лизовать интерфейс в классе можно простым указанием с помо щью ключевого слова Implements и определением методов, ука 64 Глава з интерфейсе. Методы могут несколько интерфейсов.</p><p> Структурная обработка исключений Существую две основные модели обработки ошибок. Первая предполагает возможность функции сообщать об ках, причем действия на основании функцией ошибки возлагается на вызывает функ цию. Вот пример:</p><p> Ret = If Ret = 0 then Произошла ее необходимо обработать.</p><p> End If Продолжение исполнения.</p><p> V этой модели обработки ошибок есть несколько недостатков.</p><p> При частом использовании обработка ошибок «смешивается» с получением Так, в языке программирования С фун кция указатель на файл, который используют другие функции, например fgets. Если открыть файл не удается, fopen возвращает не указатель на файл, a NULL, указывающий на то, что произошла ошибка. Таким образом, функцией значение описателем или сигналом об ошибке.</p><p> Многие разработчики прекрасно справляются с неоднозначнос тью возвращаемого но некоторые не всегда вспоми нают о необходимости проверки того, не возвращено ли в каче стве результата сообщение об ошибке. На практике большинство программистов, пишущих на С, выполняют такую проверку при вызове fopen, поскольку вероятность ошибки достаточно высо ка. Однако они же часто не проверяют ошибки в таких функци ях, как поскольку сбои в функции, работающей с коррект ным указателем на происходят довольно редко. Таким об разом, при записи в иногда происходит например, из за переполнения диска или по причине, которая остается незамеченной.</p><p> Другая модель обработки ошибок обработка исключений. В системе ошибка вызывает исключение, и это исключение перемещается в стеке, пока его не обработает соответствующий обработчик. Несмотря на то, что в Visual Basic поддерживается Объекты и языки Framework такой вид обработки с помощью оператора On Error, предлагаемая для этих целей форма не очень удобна. Возмож ности программистов, работающих с VBScript в ASP, еще более ограничены, поскольку в VBScript отсутствуют даже те возмож ности управления обработкой которые в Visual Basic или VBA (Visual Basic for Applications).</p><p> Предпочтительным видом обработки исключений исключений. Хотя это скорее особенность Framework, чем самого Visual Basic этот важный шаг вперед позволит разработчикам создавать более и надежные приложения. Общая форма обработки исключений выглядит так:</p><p> Try ' Код, которой инициировать исключение Catch e As Exception ' Обработка ошибки Finally Код, который ' независимо от того, исключение или нет Код, при которого возможно распола гают внутри блока Try. Возможно, некоторые или даже все исклю чения не удастся обработать на данном уровне. В таком случае исключение перебрасывается помощью ключевого слова Throw), но код в блоке Finally все равно Например, если в блоке Try открывается подключение к базе данных, з бло ке Finally придется закрыть это подключение, поскольку этот блок выполняется в любом случае. В блоке Finally может потребовать ся проверить, действительно ли открыто подключение к базе дан ных, поскольку исключение может возникнуть до создания под ключения. Блок Finally позволяет освобождать ресурсы, занятые в блоке Try, только в одном вместо того чтобы писать этот код несколько раз — при нормальном исполнении и по разу в каждом блоке Catch.</p><p> Перегрузка функций Перегрузка функций позволяет создавать несколько од ной функции, но с различными параметрами. Например, в мето де передачи строки в браузер можно объявить несколько функ 66 Глава с именем Write — одна будет принимать в качестве параметра другая число, а типа Программист, работающий с VBScript, может спросить, зачем это все нужно. В предыдущей объектной модели ASP можно, к при меру, метод со целым числом или датой, и это как и ожидалось. Однако тонкое раз личие все-таки есть. В VBScript все переменные имеют тип который как хамелеон приспосабливается к тому, что ся в переменной. Response просто получает то, что ему передается, и записывает результирующую строку в HTML поток. Отличие перегрузки функций в том, что в зависимости от типа аргумента вызываются разные методы Write. При вызове метода Write с аргументом, который нельзя явно преобразовать один из ожидаемый одной из перегруженных во время компиляции произойдет ошибка.</p><p> Перегрузка также применяется для корректного расширения су ществующих систем без внесения изменений в существующий код. Например, если существующий метод Write в качестве параметра только строку, а в новых обстоятельствах нужно выводить эту строку цвете, то создается новый метод Write, который воспринимает оба параметра — строку и цвет.</p><p> Исходный текст существующего метода без проблем заменяет ся на вызов нового метода с дополнительного пара метра — цвета по умолчанию. Существующих пользователей не придется переучивать, а расширенный метод Write можно исполь зовать в новых программах.</p><p> Строгий контроль переменных Одна из самых больших перемен для программистов, работаю щих с ASP и переходящих с VBScript на Basic заклю чается в необходимости строгого контроля типов. Несмотря на то, что в VBScript предусмотрена возможность пере менные, им нельзя определенный тип. Вот обычный на то время фрагмент кода:</p><p> Dim X There" Объекты и языки Framework Х= В данном примере переменной X строка, а за тем — число. В результате метод строку, содержащую число 7. Это потому что все пе ременные в VBScript одного — Variant. Для выявления можных ошибок при типов в Visual Basic добавлена директива Option Strict. Она строже, чем Option Explicit. В режиме Option Strict Visual Basic генерирует ошиб ки, когда преобразование типов приводит к потере данных, пе не или в случае позднего связывания пере Для большинства программистов, работающими с дру гими языками, это не а для программистов Visual Basic пытающихся создавать профессиональные надежные приложения, это огромный шаг вперед.</p><p> Сокращенное вычисление выражений Другая проблема, с программисты, пишу щие на и переходящие на Visual — метод вычисле ния логических Допустим, на ASP-странице сле дующий код:</p><p> While rs.EOF=False And ' Здесь что-то делаем со членами группы Программисты, давно работающие с С и и имеющие сте реотипы, решат, что если значение rs.EOF равно True, то на этом вычисление выражения завершится. В VBScript и Visual Basic 6. это не так. Даже если rs.EOF обратится в True, выражение все равно вычисляется, и это вызывает ошибку.</p><p> Очевидно, что, когда rs.EOF равно True, результат выражения заведомо равен независимо от значения других частей выражения.</p><p> В Visual Basic введены два новых логических оператора и которые применяются для сокращенного вы числения В предыдущем примере можно заменить оператор And на AndAiso:</p><p> 68 Глава While что-то со всеми членами группы Wend Если значение rs.EOF равно остальные части выражения не поскольку понятно, что значение выражения в це лом не равно True. порядок оценки можно для пользы дела, упорядочивая части логического выражения от ме нее к более сложным. Однако следует помнить, что при сокра щенном вычислении некоторые части выражения не вычисляют ся, что может побочные явления. Операторы и Or работают так же, как и раньше Visual Basic 6.0 и более ранних версиях, вычисляя все части предиката.</p><p> Прочие изменения В этом разделе перечислены другие новинки Visual Basic • Отсчет элементов во всех массивах начинается с нуля. Существуют способы обойти это ограничение, исполь зуя классы Framework, но нумерация массивов в самом языке всегда начинается с нуля. При объявлении массива ста новится заметным интересное специально раз работанное для облегчения переноса существующего кода.</p><p> Взгляните на следующее Dim a(5) as Integer Здесь создается массив из шести элементов, от до а(5).</p><p> Это позволяет разработчикам продолжать работать с масси вами, как и раньше, но те, кто разрабатывает межъязыковые компоненты, должны знать эту особенность и тщательно до кументировать поведение массивов в компонентах.</p><p> • Оператор Option не поддерживается.</p><p> • V массивов нет фиксированного размера. Можно объявлять массивы определенного размера, массивы без размера и из менять размер с помощью ключевого слова New или объявить, инициализировать и определить размер массива в одном раторе, например:</p><p> Dim As Integer = 2, 3, 4, 5, 6, 7} Объекты и языки Framework В Visual Basic для изменения размера применя ют оператор В Visual Basic 6.0 с точного раз мера этого делать нельзя.</p><p> • Нельзя точно определить длину строки.</p><p> • Нельзя использовать оператор ReDim для пере — сначала ее необходимо оператором Dim.</p><p> • Денежный тип данных больше не него рекомендуется использовать Decimal.</p><p> • Оператор Туре больше не поддерживается. Вместо него сле дует использовать конструкцию the Каждому члену Structure необходимо назначить модификатор доступа: Protected, Protected Friend или Private.</p><p> Можно также применять оператор Dim, в этом случае члену структуры тип доступа Public.</p><p> • Для нескольких переменных одного типа доста точно перечислить их через запятую на одной строке и один раз указать тип, как в следующем примере:</p><p> Dim I, J as Integer В Visual Basic 6.0 переменная / получит тип a це лый тип, а в Visual Basic обе переменные будут целого типа.</p><p> • V объявленных внутри блока, область видимос ти не выходит за рамки блока и не распространяется на всю процедуру. Таким образом, если объявить переменную / внут ри блока While, она будет видима только внутри этого блока.</p><p> Нужно отметить, что время жизни переменной такое же, как и у процедуры, поэтому, если код блока, в котором объявля ется выполняется несколько раз, при каждом выполнении этого кода переменную следует инициализиро вать.</p><p> • При вызове процедур даже с одним параметром необходимо использовать круглые скобки.</p><p> • Вместо While и Wend в Visual Basic используются While и End While. Wend больше не поддерживается.</p><p> • Функция заменена на a — на Reference.</p><p> 70 Глава Основные сведения о языке С# Многие программисты, работающие с С и С+ +, с особым нетер пением ожидали возможности С# в (произносится как «си новый спе циально для работы с Framework. В частности он разрабо тан для надежной работы программ в среде с управляемым ко дом. Использование указателей — это одна из причин, по кото рой программы на С и C + + не могут нормально функциониро вать в такой среде. Хотя оба языка и без указателей, это чрезвычайно трудно. Как я уже го ворил з главе 2, указатели подрывают безопасность кода и по этому их не рекомендуется применять в за исключени ем чрезвычайных обстоятельств.</p><p> Синтаксис С# очень похож на синтаксис C + +, но в то же самое время он использовать особенности Frame work, в том числе библиотеку классов и «сборку мусора». Блоки заключаются в фигурные скобки, и многие ключевые слова (while, if и т.д.) работают точно так как и в C++. Это сходство удобную площадку для программи стов, пишущих на и планирующих работать в ASP.NET.</p><p> Различия и С# Понятно, что если бы был в точности похож на неза чем его и создавать. Требовался же язык программирования, похожий на C + +, но более и надежный. Для многих та ким языком стал Java, но и он имеет ряд недостатков, свойствен ных C + +, но устраненных в Поскольку программистов, работающих с С+ + и переходящих на разработ ку в среде ASP.NET, станет я расскажу о различиях между C++ Более безопасное управление памятью Одна из где практически все программисты C + + сами создают себе управление памятью и указатели. Хотя современных компиляторов C + + предупреждают о случаях использования указателей без их эти предупреждения можно проигнорировать. Не менее важно сле дующее: когда указатель и объект или блок памяти, на который он указывает, освобождается, ничто не за Объекты и языки Framework программе повторно использовать этот указатель, так как он точно не указывает на NULL, а на только что освобожден ный участок памяти. В такой ситуации часто возникают которые трудно «отловить» при отладке. они появляются при определенных обстоятельствах, а при отладке их не кошмар для программиста, работающего с C + +. Проблему ре шает переход на В не используется явное освобождение созданных тов — механизм «сбора мусора» ссылки на управ Объект становится доступным для удаления, когда больше не остается каких-либо ссылок на него. спо соб более безопасен, чем методы, используемые в тах, когда программистам приходится самостоятельно обеспечи вать подсчет ссылок.</p><p> С# не поддерживает указатели в безопасном или управляемом коде. В поддерживается механизм ссылок при передаче фун кциям параметров, который действует как система указателей, однако исключение указателей из безопасного кода снижает роятность некорректного доступа к памяти.</p><p> шаблонов Программистов, пишущих на и собирающихся перейти на несомненно разочарует отсутствие шаблонов. Они позволя ют типы. Например, после со здания класса массива целых чисел иногда требуется класс мас сива чисел с плавающей точкой. Шаблоны предлагают способ решения задачи без копирования и вставки исход ного текста из класса в класс. Шаблоны в общем-то так же, но всю работу компилятор выполняет за кадром, то есть программисту об этом заботиться не нужно.</p><p> Очень маловероятно, что в С# будет предусмотрена поддержка шаблонов. В настоящее время разработчики С# рассматривают другие альтернативы общего решения задач внедрения без ис шаблонов. В Framework классы массивов, поэтому описанная задача не должна вызывать особых затруд нений. Однако в других случаях определенное общее решение не помешало бы.</p><p> 72 Глава Отсутствие множественного наследования Как Visual Basic C# не поддерживает на следование, и это также не создает особых проблем. В (и в Visual Basic можно создавать класс, несколь ко Обычно этого достаточно для решения задачи.</p><p> Многие работающие с C + +, прекрасно чувство вали себя и без множественного наследования, и я уверен, его отсутствие не сильно расстроит пишущих на Отсутствие глобальных функций В отличие от C + +, который изначально задуман как позво ляющий программистам естественно перейти к использованию классов и других особенностей про граммирования, в большинство приемов составляют и плоть» язы ка. После выхода в свет C + + для преобразования практически всех программ с С на C + + достаточно было просто изменить расширение с на.срр и перекомпилировать программу.</p><p> это были ненастоящие программы но описанная по крайней мере позволяла программистам восполь зоваться такими преимуществами компиляторов C++, как вы вод подробных предупреждений, об использовании функций без предварительного Переход на принципиально отличается. Например, во всех кни гах или учебных пособиях по программированию на С и C + + на протяжении последних 20 лет публикуется программа «Hello World», исходный текст которой выглядит примерно так:</p><p> Эту программу можно скомпилировать с примене нием большинства С или C+ +, однако это не кор ректная программа на Все функции в типичной программе на С# являются методами класса. В версия «Hello World» должна приблизительно так:</p><p> Public class Объекты и языки Framework public static void Main() [ Все стандартные консольные приложения используют з ка честве точки входа метод Main некоторого класса. На практике это не создает проблем в программ но важно помнить, что глобальных функций не существует — есть только методы класса.</p><p> Отсутствие макросов препроцессора В С u C + очень активно использовались макросы, интерпрети руемые препроцессором. Препроцессор обрабатывает исходный текст перед и при наличии макросов меняет отдель ные строки. Препроцессор чрезвычайно удобен, однако иногда его использование вызывает неполадки.</p><p> В отсутствует отдельно выделенный препроцессор, но это никак не отражается на выполнении директив препроцессора.</p><p> Директивы препроцессора в основном те же, что и в C/C++, например #eise и Кроме того, допускаются директи Visual Studio такие, как и Однако директива отсутствует.</p><p> Что можно делать в С#, но нельзя — в Visual Basic Наиболее часто в телеконференциях Usenet спрашивают, что же такое позволяет делать что недоступно в Visual Basic На момент написания этих строк в С# есть только одна важная осо бенность, которая отсутствует в Visual Basic и несколько, которые обязательны в но необязательны в Visual Basic Перегрузка операторов В посвященном Visual Basic я упоминал о перегруз ке функций, то есть поддержке нескольких функций с одним име нем, но с разным списком параметров. В поддерживается этот вид перегрузки, но, кроме того, возможна операто которая отсутствует в Visual Basic Она позволяет со здавать метод, который вызывается при использовании таких операторов, ++ или при 74 Глава ращение). Перегрузка операторов напоминает перегрузку опера торов в C + +, но и отличия. В таблице 3-4 перечислены опе раторы с указанием возможности перегрузки в Таблица 3-4. С# и возможность их Операторы Тип оператора Возможность перегрузки !, ~, ++, Да true, false +, -, *, /, %, &, Бинарный Да — <, >, Сравнение Да, но только попарно. Напри мер, если перегружен оператор =, то оператор также дол жен перегружаться Логическое &&, Нет, хотя одинарные операто ры & и перегружать можно Индексы Нет, но тот же результат можно массива получить за счет использования индексаторов. Этот оператор можно применять, в частности, для создания виртуального массива Нет, но тот же результат можно типов получить за счет использования операторов преобразования (явного и неявного) _ Присвоение Нет, хотя возможно использо + *=// вание соответствующих перегруженных операторов, например в = используется оператор + =, запятая (,), ?:, Другие Нет ->, new, is, sizeof, typeof Недавно по я видел рекламу: группа людей с любо пытством ожидает сноса большого здания — одного из многих других;</p><p> после запланированного взрыва, когда улеглась, неожиданно руководитель работ подает сигнал — и несколько близлежащих домов также рушатся. На вопрос репортера;</p><p> «За руководитель работ отвечает: «V нас оставалось немного лишнего динамита, и мы решили, что нечего ему пропадать зря».</p><p> Объекты и языки Framework операторов весьма напоминает эту ситуацию. Она имеет свою нишу применения и часто бывает до полезной. Но помните: возможность не необхо димость. Вот небольшой пример, который поможет как следует применять перегрузку операторов.</p><p> public class !</p><p> public int public int public int blue=0;</p><p> public MyColor(int blue) { } public static MyColor operator (MyColor c1, MyColor c2) { return } public static void MyColor red new MyColor green = new MyColor yellow = + green;</p><p> of } Это не ахти полезный пример перегрузки операторов про сто иллюстрирует, как именно она происходит. В этом примере оператор «плюс» (+) перегружается в классе MyColor. Затем сум два экземпляра этого класса — 7 и с2.</p><p> При перегрузке операторов рекомендуется правила, полученные эмпирическим Из книги Douglas J. Reilly «Computer Стр. 57.</p><p> 76 Глава • Применяйте стандартные математические операторы (+, -, * и /) для всех числа. Популярный пример — класс комплексных чисел.</p><p> • перегруженные операторы для тех целей, кото рые пользователи от вас ожидают. Например, очевидно, что должен делать оператор присвоения со строками.</p><p> • Помните о что некоторые операторы по функциям (например, пары + и -, * и /). Перегруженные операторы должны также выпол нять противоположные • Не идите против ожидания и естественных убеждений пользо Создавать перегруженный оператор «плюс» (+) для глупо, и самый простой пример того, как по ступать не нужно. Но иногда сложности спрятаны глубже.</p><p> Например, какого результата ожидать от применения опера тора приращения к строке «Hi there»?</p><p> А как насчет (числовое каждого ASCII символа увеличено на единицу)? Если не очевидно, что имен но должен делать оператор, не создавайте его.</p><p> • Не перегружайте оператор изменения данных, если исход ный оператор их не изменяет. Так, не стоит перегружать опе ратор сравнения, например оператор равенства {= = ), чтобы он изменял хотя бы одну из при проверке на равенство.</p><p> • Создайте метод, который позволит не поддерживающих перегрузку операторов, получить ту же самую функциональность.</p><p> Принудительное раннее связывание Программисты, пишущие на C + +, уверены, что переменные всегда и имеют определенный тип. Исторически сложилось так, что на Visual Basic это делать не обяза тельно, хотя опытные программисты использовали режим Option Explicit для переменных. До выхода Visual Basic объявление переменных не только было необязатель ным, но и не всегда предоставлялась возможность четко опре делить тип переменных.</p><p> В Visual Basic введена новая директива Option Strict, кото рая предотвращает неявные преобразования, а также позднее Объекты и языки Framework Последнее происходит, когда после создания объек та его тип определяется только во время исполнения. под ход иногда оказывается полезным, но, например, в СОМ-объек тах позднее почти вдвое увеличивает объем ин формации, которой обмениваются клиент и СОМ-объект. Опре деление типа используемого объекта на стадии (во время компиляции) компилятору более быстрый код.</p><p> Примечание Option Exp и Option Strict в что их легко забыть. К сча стью, в предусмотрен способ принудитель ного их использования от приложения к приложе нию. Более подробно об этих возможностях вы уз наете в главе 4.</p><p> В директивы Option Explicit и Option Strict не нужны. Точнее, в этом языке использовать переменные без предвари тельного объявления их самих и их типа. Я читал обзоры о сис темах разработки динамического информационного наполнения для Интернета, в том числе и об ASP, в которых возможность использования переменных без объявления рассматривалась как преимущество. В это допустимо при разработке в Visual Studio однако я настоятельно советую вам использо вать директиву Option Strict при создании исходных текстов на Visual Basic С# не поддерживает позднее, это един ственное, в чем программы на без сомнения, превосходят программы на Visual Basic В общем, все языки программи рования обеспечивают более или менее одинаковую произ водительность. В случае с Visual Basic и аналогичные по функциям программы преобразуются в аналогичный и поэтому в среде Framework будут исполняться с практичес ки одинаковой скоростью. Быстродействие сложных программ на Visual Basic где, возможно, непреднамеренно примене но позднее связывание, окажется немного ниже, чем програм мы на выполняющие те же задачи.</p><p> 78 Глава Заключение Из главы вы узнали почти что нужно, работы с Я надеюсь, что короткое знакомство с типа ми, и стандартными языками Framework поможет зам. В следующей главе я расскажу о программировании в сре де Если хорошо знакомы с HTML, трудностей воз никнуть не должно, если же нет, я рекомендую ознакомиться с приложением Б. В нем изложены базовые о HTML, без них вам будет сложно понять материал следующих глав.</p> <div class="po5"></div> <div class='stranici1'><b class='temiser'>Pages:</b>     |<div class='kr'><a class="kn1" href="/1/40982-1-t-posvyaschaetsya-timu-erin-zhivu-blagodarya-lyudyam-kotorih-lyublyu-douglas-reiily-designing-microsoft-as.php" title=""> 1 </a></div>|<a class="kn1" href="/1/40982-2-t-posvyaschaetsya-timu-erin-zhivu-blagodarya-lyudyam-kotorih-lyublyu-douglas-reiily-designing-microsoft-as.php" title=""> 2 </a>|<a class="kn1" href="/1/40982-3-t-posvyaschaetsya-timu-erin-zhivu-blagodarya-lyudyam-kotorih-lyublyu-douglas-reiily-designing-microsoft-as.php" title=""> 3 </a>|<a class="kn1" href="/1/40982-4-t-posvyaschaetsya-timu-erin-zhivu-blagodarya-lyudyam-kotorih-lyublyu-douglas-reiily-designing-microsoft-as.php" title=""> 4 </a>|<a class="kn1" href="/1/40982-5-t-posvyaschaetsya-timu-erin-zhivu-blagodarya-lyudyam-kotorih-lyublyu-douglas-reiily-designing-microsoft-as.php" title=""> 5 </a>|</div> <div class="separator2"></div> <div class="po122"> <img class="doc" src="/images/doc.gif" border="0" alt="" ><a class="menusil" href="/1/" title=""><b class="jir">Книги, научные публикации</b></a> </div> <div class="niz2"> <br><br> <noindex> <center> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- dislib-kvadrat (niz) --> <ins class="adsbygoogle" style="display:inline-block;width:336px;height:280px" data-ad-client="ca-pub-9894471784993021" data-ad-slot="3110193131"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </noindex> <br> <div class="naverh"><A href="#verh" >наверх</a><img src="/images/s.gif" hspace="3" width="5" height="11" border="0" alt="" align="top" vspace="3" ></div> </td></tr></table> <table width="100%" cellspacing="0" cellpadding="0" border=0> <tr> <td bgcolor="#CCCCFF" height="1"> </td> </tr> <tr> <td class="menu-niz"> <center> <table cellspacing="0" cellpadding="0" border=0> <tr> <td class="menu-niz1"> |  • <a href="/" title="На главную">Главная</a>  |  • <a href="/admin/contact-kontakti-dissertatsii.php" title="Контакты">Контакты</a> |  </td> </tr> </table> </center> </td> </tr> <tr><td class="line1"></td> </tr> </table></td><td class="line"><img class="lin" src="/images/spaser1.gif" border="0" alt=""></td></tr></table> </td><td valign="top"> <table width="5" border="0" cellspacing="0" cellpadding="0"> <tr> <td></td></tr></table></td></tr></table> </td><td class="site2"></td></tr><tr><td colspan="3"> <noindex> <script type='text/javascript' src='http://recreativ.ru/rcode.97536708c5.js'></script> <script type='text/javascript' src='http://recreativ.ru/rcode.88aa634d1b.js'></script> <script type='text/javascript' src='http://recreativ.ru/rcode.30746632cd.js'></script> </noindex> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td valign="top" class="cap1"> <font color="#808080">© 2011 www.dissers.ru - «Бесплатная электронная библиотека»<br><br> <noindex> Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам. <br> Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, <a href="/admin/contacts.php" title="">напишите нам</a>, мы в течении 1-2 рабочих дней удалим его. </noindex> </font> </div> </td> </tr> </table> <noindex> <!-- Yandex.Metrika counter --> <script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript"></script> <script type="text/javascript"> try { var yaCounter78166 = new Ya.Metrika({id:78166,type:1}); } catch(e) { } </script> <noscript><div><img src="//mc.yandex.ru/watch/78166?cnt-class=1" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </noindex></td></tr></table> </body> </html>