Если вам доводилось работать с предыдущими версиями VB, интегрированная среда разработки
(IDE) .NET — Visual Studio .NET — покажется отдаленно знакомой. Многое сохранилось
с прежних времен — сама концепция ускоренной разработки приложений (RAD, Rapid
Application Development); элементы, размещаемые на форме; запуск программы клавишей
F5 и т. д.; но многое изменилось, притом в основном в лучшую сторону. Например,
ужасный редактор меню, сохранившийся со времен VB1, был заменен системой редактирования
меню «на месте», пользоваться которой — одно удовольствие (см. главу
8).
Кроме того,
VB .NET, в отличие от прежних версий VB, не ограничивается приложениями, ориентированными
на графический интерфейс, и позволяет строить приложения других типов. Например,
к вашим услугам web-приложения, серверные приложения и даже консольные приложения,
работающие в окне, похожем на окно DOS-сеанса. Все «визуальные»
языки Microsoft наконец-то обрели единую среду разработки. Времена, когда в
VC++, VJ++, Visual InterDev и Visual Basic использовались разные IDE, безвозвратно
прошли (кстати говоря, пакет Visual InterDev был интегрирован в VS .NET). Другая
приятная особенность новой среды — широкие возможности настройки. Теперь среду
VS .NET можно настроить так, чтобы она была похожа на IDE от VB6 или любую другую
IDE по вашему выбору.
Эта глава
написана Для того, чтобы дать общее представление об IDE, а не для того, чтобы
мучить вас утомительными подробностями. Лучший способ освоиться в IDE — начать
пользоваться ею, в случае необходимости прибегая к справочной системе. Мы рекомендуем
бегло просмотреть эту главу и возвращаться к ней по мере надобности. Стороны
IDE, связанные с конкретными аспектами программирования (скажем, конструирование
графического интерфейса программы), более подробно рассмотрены в следующих главах.
Если
вы еще не работали с Visual Basic, эту главу следует читать более подробно.
Пользователи
прежних версий VB обычно предпочитают, чтобы среда IDE по внешнему виду и поведению
была как можно ближе к традиционной среде VB6. Для этого откройте на начальной
странице VS ссылку My Profile и выберите строку Visual Basic Developer в списке
Profile, как показано на рис. 2.1.
Рис.
2.1. Начальная страница Visual Studio
Вы можете
настроить клавиатуру и раскладку окон и сохранить разные комбинации параметров
в разных профилях. Чтобы сменить профиль, выполните команду Help > Start
Page и откройте ссылку My Profile.
В VB .NET
каждый проект является частью того, что Microsoft называет решением (solution).
Любой код, созданный в VB .NET IDE, относится к некоторому решению. Решение
можно рассматривать как хранилище всей информации, необходимой для компиляции
программы и ее перевода в форму, пригодную для исполнения. Таким образом, решение
состоит из одного или нескольких проектов; различных вспомогательных файлов
(графических изображений, ресурсных файлов, метаданных, то есть данных,
описывающих другие данные, и т. д.); документации в формате XML и практически
всего, что приходит В голову. Программисты с опытом работы на VB5 или 6 могут
рассматривать решение как аналог программной группы. На первых порах решения
кажутся неудобными; откровенно говоря, при
написании мелких программ они действительно слишком громоздки. Но постепенно
вы привыкнете к решениям и убедитесь, что они заметно упрощают работу над крупными
коммерческими проектами. Дело в том, что решение позволяет легко выбрать файлы,
задействованные в решении конкретной проблемы.
Новое решение
создается командой File > New. Вам предлагается выбрать один из двух вариантов:
создать новый проект (New Project) или пустое решение (Blank Solution). Даже
при выборе первого варианта IDE все равно создает решение. Различие между этими
вариантами заключается в том, что при выборе определенного типа проекта VS .NET
IDE создает несколько служебных файлов и включает их в решение (тип файлов зависит
от выбранного типа проекта).
Как правило,
работа над новой программой начинается с команды New Project. На экране появляется
диалоговое окно (рис. 2.2; список проектов прокручен примерно до середины).
В окне перечислены типы проектов, автоматически создаваемых в VB .NET, — на
момент написания книги их было десять. Шаблоны проектов VB .NET работают практически
.так же, как в VB6. В частности, они почти всегда содержат «скелет»
программы, и в них обязательно присутствует служебная информация о файлах, входящих
в решение.
Рис.
2.2. Диалоговое окно New Project
После прокрутки
списка в диалоговом окне New Project появляется значок Console Application (Консольное
приложение), показанный на рис. 2.2. Обратите внимание: при выборе любого значка,
кроме последнего — New Project in Existing Solution (Новый проект в существующем
решении), — вам не придется подтверждать создание нового решения. Дело в том,
что при создании нового проекта за пределами существующего решения IDE создает
базовую структуру решения за вас. Большинство программистов .NET предпочитают
создавать решения в отдельных каталогах, имена которых совпадают с именами решений.
По умолчанию IDE поступает с новыми решениями именно таким образом.
Чтобы
сосредоточить все внимание на новых возможностях языка VB .NET, не отвлекаясь
на тонкости работы графических приложений в .NET, в первой части книги рассматриваются
только консольные приложения. Они работают в текстовом режиме; с некоторым упрощением
можно считать, что весь ввод/вывод осуществляется в окне DOS (данные читаются
из стандартного входного потока и записываются в стандартный выходной поток).
В нашем примере
решение было названо vb_ide_01, но вы можете использовать любое допустимое имя
файла. При желании в него можно включить прописные буквы или пробелы. Регистр
символов в файловой системе Windows игнорируется при выполнении операций, но
сохраняется для удобства пользователя. При установке флажка Create Directory
for Solution (Создать каталог для решения) IDE автоматически создает в заданном
основном каталоге подкаталог, имя которого совпадает с именем решения. В нашем
примере это привело к созданию каталога C:\vb net book\Chater 2\vb_ide_01. Примерный
вид IDE показан на рис. 2.3.
Рис.
2.3. Visual Studio IDE в начале работы
При помощи
команды View в главном меню всегда можн9 вызвать нужное окно на передний план
(и передать ему фокус). Все окна IDE свободно перетаскиваются мышью. Кстати
говоря, они не являются дочерними окнами многодокументного интерфейса MDI (Multiple
Document Interface), которые должны находиться в границах родительского окна
— любое окно можно переместить за пределы главного окна IDE.
Не
забывайте о том, что в IDE существует режим контекстной справки. На рис. 2.4
показан примерный вид справки, вызванной клавишей F1 при нахождении фокуса в
окне решения (Solution Explorer). Также поддерживается режим динамической справки
(клавиши Ctrl+Fl), который автоматически отслеживает ваши действия и пытается
вызвать соответствующий раздел справки. На рис. 2.5 показан список разделов
динамической справки, полученный в начале работы над проектом. У динамической
справки есть один серьезный недостаток — она интенсивно расходует ресурсы процессора.
Когда вы освоитесь в IDE, отключите этот режим, чтобы повысить быстродействие.
Рис.
2.4. Контекстная справка
Бросается
в глаза другая эффектная особенность IDE — если пристыкованное (docked) окно
полностью перекрывает другое окно, это вызовет меньше проблем, чем в VB6, поскольку
скрытые окна автоматически отображаются в виде корешков (tabs). Пример показан
на рис. 2.6 — обратите внимание на корешки в позиции курсора. Чтобы вызвать
скрытое окно, достаточно щелкнуть на корешке и перетащить его мышью. Чтобы изменить
порядок окон (например, для экономии места), просто перетащите один корешок
поверх другого. Подобное использование корешков выгодно отличает VS .NET от
VB6 IDE, где в результате неосторожной стыковки окон становилось совершенно
невозможно работать и для возвращения к нормальному состоянию приходилось править
системный реестр. Также обратите внимание на корешок Start Page главного окна,
предназначенный для вызова начальной страницы IDE.
Рис.
2.5. Динамическая справка
Рис.
2.6. Пристыкованные окна с корешками
В этом разделе
описаны основные окна IDE. Специализированные окна (например, предназначенные
для отладки) рассматриваются позже в этой или в одной из последующих глав. Но
сначала напомним, что в VS .NET IDE, как и в большинстве современных приложений
Windows, контекстные меню вызываются правой кнопкой мыши. Поэкспериментируйте
и освойтесь с разными вариантами контекстных меню. Например, контекстное меню
редактора показано на рис. 2.7.
Рис.
2.7. Контекстное меню редактора
Как видите,
в этом контекстном меню объединяются команды редактирования и отладки.
Кнопки панелей
инструментов снабжены подсказками [Предусмотрена даже автоматическая нумерация
строк программы! Режим нумерации включается в диалоговом окне, вызываемом командой
Tools > Option > Text Editor.]. На некоторых кнопках имеются стрелки,
показывающие, что при нажатии кнопки открывается меню. Например, вторая кнопка
слева (Add New Item) открывает список элементов, которые можно включить в решение
(рис. 2.8).
В
VB .NET снова стали доступны чрезвычайно удобные команды блочного комментирования/снятия
комментариев, впервые появившиеся в VB5. Теперь эти команды вызываются со стандартных
панелей инструментов IDE, а не из меню Edit, откуда они таинственно исчезли
в VB6.
Панель элементов
(toolbox) используется преимущественно при программировании приложений GUI (см.
главу 8), но на ней также расположен многоэлементный буфер обмена (clipboard
ring), описанный в следующем разделе. Необходимо упомянуть и о такой экзотической
возможности, как сохранение фрагментов кода прямо на панели элементов. Эта тема
тоже рассматривается в следующем разделе.
Как ни странно,
само наличие подсказок убеждает в том, что графический интерфейс не всемогущ.
Кто знает, что нас ждет в будущем — может, в каком-нибудь прогрессивном варианте
пользовательского интерфейса на кнопках вместо рисунков будет размещаться текст?
Рис.
2.8. Вызов меню с панелей инструментов
Редактор
обладает полным набором стандартных возможностей, поддерживаемых в редакторах
такого рода (вырезание, вставка, поиск/замена и т. д.). Для работы с ними можно
использовать стандартные комбинации клавиш Windows (Ctrl+X — вырезать, Ctrl+V
— вставить и т. д.). Если вы предпочитаете работать с командами меню, к вашим
услугам меню Edit и контекстное меню окна программы. Полный список сочетаний
клавиш вызывается из меню Edit; кроме того, он приведен в разделе «Editing,
shortcut keys» справочной системы. Например, комбинация Ctrl+I включает
режим поиска с приращением.
Некоторые
команды — такие как Option Explicit— используются по умолчанию и не отображаются
в окне программы, как в VB6 (хотя мы все равно включаем их в программу по привычке!).
Подробнее об этих командах будет рассказано в следующей главе.
В вашем распоряжении
и очень удобное средство IntelliSense, выдающее информацию о методах заданного
объекта или параметрах, передаваемых при вызове функции (рис. 2.9). Обычно IntelliSense
автоматически вызывается при вводе символа «.».
Настройка
большинства глобальных параметров редактора выполняется в диалоговом окне —
выполните команду Tools > Options и выберите в списке строку Text
Editor, как показано на рис. 2.10. По сравнению с VB6 диалоговое окно Options
основательно изменилось, поэтому мы рекомендуем внимательно изучить его содержимое.
Например, чтобы выбрать размер позиций табуляции, щелкните в строке Text Editor
(см. рис. 2.10) и выберите нужное значение для всех языков или только для VB.
Здесь же выбирается режим создания отступов: None (отступы отсутствуют), Block
(курсор выравнивается по началу предыдущей строки) или Smart (автоматическое
создание отступов в теле цикла, как того требует хороший стиль программирования).
Кстати говоря, устанавливать размер позиций табуляции и форматировать
отступы можно в готовом тексте, для чего используются комбинации клавиш Ctrl+K,
Ctrl+F или- команда Edit > Advanced > Format Selection. Если в
режиме Smart выделить фрагмент программы и нажать клавиши Shift+Tab, этот фрагмент
будет переформатирован.
Module Modulel
Sub Main()
System.Console.
End Sub
Рис.
2.9. Подсказка IntelliSense
Рис.
2.10. Диалоговое окно Options
Новый редактор
поддерживает и такую удобную возможность, как свертка фрагментов программы и
отображение на их месте заголовков. Обратите внимание на значки «+»
рядом с некоторыми строками на рис. 2.11. Если щелкнуть на таком значке, в листинге
открывается соответствующая область (region). Если задержать указатель
мыши над многоточием (...), на экране будет показан свернутый код. Для управления
сверткой используется подменю Edit > Outlining.
Вы
можете определять в программе собственные области; для этого достаточно имитировать
синтаксис, показанный на рис. 2.11. Сворачиваемый блок (регион) начинается с
команды «Region "имя_региона" и завершается командой #End Region.
Рис.
2.11. Свернутые области в редакторе
Редактор
VS .NET обладает и другими интересными возможностями, незнакомыми даже опытным
программистам VB. Мы познакомимся с ними в следующем разделе.
При
изучении редактора IDE особенно полезная информация находится в разделе справки
«Editing Code and Text». В частности, здесь описано несколько очень
удобных средств перемещения по тексту.
Буфер обмена
рассчитан не на один элемент, а на несколько сразу (аналогичные возможности
существуют в Office 2000 и Office XP). Весь вырезанный или скопированный текст
передается в многоэлементный буфер обмена, к которому можно обратиться с панели
элементов. Чтобы просмотреть текущее содержимое буфера, щелкните на корешке
Clipboard Ring на панели элементов. В буфере хранятся 15 последних скопированных
или вырезанных фрагментов текста.
Комбинация
клавиш Ctrl+Shift+V вставляет очередной элемент буфера в текущий документ.
Многократно
нажимая клавиши Ctrl+Shift+V, вы перебираете содержимое буфера. При каждом нажатии
Ctrl+Shift+V предыдущий вставленный фрагмент заменяется текущим элементом буфера.
Любой фрагмент
программного кода можно сохранить для последующего использования на панели элементов
(многие программисты используют для этой цели вкладку General, но вы
можете создать новую вкладку — щелкните на панели правой кнопкой мыши и выберите
команду Add Tab из контекстного меню). Данная возможность очень удобна, поскольку
в программах часто встречаются повторяющиеся фрагаенты,
а вводить их каждый раз заново слишком долго. Чтобы сохранить фрагмент программы,
выделитеего и перетащите мышью на панель элементов (рис. 2.12). Фрагменты остаются
на панели до тех пор, пока не будут удалены при помощи контекстного меню. Чтобы
воспользоваться сохраненным фрагментом, перетащите его мышью в нужную позицию
окна программы. Существует и другой способ — выделите позицию вставки и дважды
щелкните на сохраненном фрагменте.
Рис.
2.12. Фрагменты программы на панели элементов
Список задач и комментарии TODO, HACK и UNDONE
В Visual
Studio теперь поддерживается список задач (task list), унаследованный из Visual
InterDev и Visual J++. Идея состоит в том, что в программу включаются комментарии
с описанием действий, которые предполагается выполнить в будущем; тип задачи
определяется специальным ключевым словом, следующим после знака комментария.
В настоящее время определены три встроенные категории задач — TODO, HACK и UNDONE.
Комментарии с задачами выводятся в окне, вызываемом командой View > Other
Windows > Task List (или комбинацией клавиш Ctrl+Alt+K). Пример показан
на рис. 2.13.
Для списка
задач можно определять пользовательские ключевые слова. Предположим, вы хотите
помечать ключевым словом FOR_KEN те фрагменты кода, которыми должен заняться
ваш коллега Кен. Определение пользовательских ключевых слов для списка задач
происходит следующим образом:
В окне решения
(Solution Explorer), показанном на рис. 2.14, выводится список файлов, входящих
в решение. По умолчанию имя решения совпадает с именем первого созданного в
нем проекта. На рисунке изображено решение vb_ide_01 с проектом vb_ide_01, содержащим
файл с именем Modulel.vb.
Рис.
2.13. Список задач
Рис.
2.14. Окно решения и окно свойств для файла Module1.vb
В VB .NET
всем файлам с кодом Visual Basic независимо от их типа присваивается
расширение .vb — расширения .frm, .bas и .cls не используются. Впрочем, одна
важная особенность осталась неизменной: файлы с расширением .vb, как и в VB6,
содержат обычный текст (причем в бесплатно распространяемый пакет .NET SDK входит
автономный компилятор VB для компиляции программ, написанных во внешнем текстовом
редакторе).
Позже
вы узнаёте, как в IDE конструируются формы и как среда определяет, какие части
файла имеют визуальное представление, а какие не имеют. А пока достаточно запомнить,
что все файлы VB .NET имеют расширение .vb.
В
начале работы можно создать пустое решение без создания проекта — для этого
следует выбрать опцию Visual Studio Solutions4Blank Solution в диалоговом окне
New Project. Обычно это делается в тех случаях, когда вы не хотите, чтобы имя
решения совпадало с именем одного из проектов.
Функции окна
свойств в VS .NET (также показанного на рис. 2.14) уже не ограничиваются простым
заданием свойств элементов управления. Содержимое окна зависит от того, что
в настоящий момент выделено в IDE. Имя и тип выделенного элемента указаны в
списке, находящемся в верхней части окна. Чтобы изменить значение свойства,
щелкните в правой ячейке и начинайте вводить символы. В окне свойств действуют
стандартные комбинации клавиш, используемые при редактировании в системе Windows.
На рис. 2.14
в окне свойств задаются свойства файла Modulel.vb. При помощи этого окна можно
задать свойства дизайнера (например, используемого при построении web-приложений
или серверных приложений).
Кнопка |
Описание |
|||
|
Отображает страницу свойств, если она существует (как и в VB6, страницы свойств упрощают ввод сложных значений) |
|||
|
Выводит алфавитный список всех свойств и их значений с разбивкой по категориям |
|||
|
Сортирует свойства и события |
|||
|
Выводит список свойств объекта. Если с объектом связаны события, они также включаются в список |
|||
Иерархический
список файлов в окне решения содержит ветвь References с информацией обо всех
сборках (assemblies), используемых в проекте (пока можно считать, что термин
«сборка» является аналогом DLL; сборки подробно описаны в главе
13). Диалоговое окно внешних ссылок в решениях VB .NET напоминает похожее окно,
которое использовалось для импортирования библиотек СОМ в проектах VB6. Некоторые
базовые сборки .NET используются в каждом проекте. Разверните ветвь дерева,
щелкнув назначке «+»; примерный результат показан на рис. 2.15.
Обратите внимание — имена всех базовых сборок начинаются с префикса System.
Теперь щелкните
правой кнопкой мыши в строке References окна решения и выберите в контекстном
меню команду Add Reference (также можно воспользоваться командой Project >
Add Reference главного меню). На экране появляется диалоговое окно, изображенное
на рис. 2.16. В нем можно добавлять внешние ссылки трех типов: .NET, COM и другие
проекты (Projects).
Рис.
2.15. Перечень внешних ссылок в окне решения
Рис.
2.16. Диалоговое окно Add Reference
В
приложениях .NET можно использовать традиционные компоненты СОМ, а следовательно,
и компоненты ActiveX (в том числе и написанные вами). Взаимодействие технологий
.NET/COM основано на механизме COM Interop (см. главу 13). Впрочем, потенциальная
возможность еще не означает, что это бледует делать. Использование компонентов
СОМ в приложениях .NET сопряжено с основательными затратами ресурсов.
В окне вывода
(вызываемом командой View > Other Windows или комбинацией клавиш Ctrl+Alt+О)
отображается текущая информация состояния. При построении решения (см. раздел
«Компиляция» данной главы) в этом окне компилятор выводит сообщения
как об успешном завершении, так и о возникших ошибках.
Окно команд
(вызывается командой View > Other Windows или комбинацией клавиш Ctrl+Alt+A)
напоминает окно отладки (Immediate window) VB6 и применяется в процессе отладки,
о котором будет рассказано ниже. К сожалению, пользы от него существенно меньше,
чем от окна отладки VB6, — окно команд не поддерживает IntelliSense и не работает
в режиме конструирования (а точнее, окно команд обладает крайне ограниченной
поддержкой IntelliSense для меню и макросов, но не для объектов и не в процессе
отладки).
С другой
стороны, окно команд позволяет взаимодействовать со средой IDE. Например, в
нем можно ввести команду:
File.AddNewProject
На экране
появляется диалоговое окно New Project. Выглядит эффектно, но на практике удобнее
работать с меню.
Окно команд
работает в двух режимах: в режиме команд (Command) и в режиме непосредственного
ввода (Immediate). Для переключения между режимами в окне вводятся строки >cmd
или immed (без префикса <<>»!). Ниже перечислены комбинации клавиш,
используемые при перемещении в окне команд.
Операция |
Клавиши |
||
Перебор ранее введенных команд | вверх, вниз | ||
Прокрутка окна вверх | Ctrl + вверх | ||
Прокрутка окна вниз |
Ctrl + вниз |
||
Чтобы
скопировать ранее введенную команду (полностью или частично) в строку текущей
команды, перейдите к нужной команде, выделите ее и нажмите Enter.
Вернемся
к решению vb_ide_01, о котором говорилось выше. Хотя мы еще не ввели ни одной
строки программного кода, VB .NET автоматически создает в каталоге решения несколько
файлов и подкаталогов (в этом нетрудно убедиться при помощи Проводника Windows).
Ниже приведен полный список содержимого каталога; в вашем случае данные будут
похожими, хотя и не совпадающими полностью.
943 Assemblylnfo.vb
<DIR>
bin
79 Modulel.vb
<DIR>
obj
1,354 vb_ide_01.sln
7,168 vb_ide_01.suo
3,008 vb_ide_01.vbproj
1.643 vb_ide_01.vbproj.user
6 File(s) 14,195
bytes
Прдкаталоги
bin и obj используются при компиляции, а четыре файла образуют решение. В каталоге
bin хранится откомпилированный код. В каталоге obj находится подкаталог, задействованный
в процессе отладки. Исходный текст программы хранится в файле Modulel.vb. При
просмотре файла в текстовом редакторе вы увидите следующий код:
Module Modulel
SubMain()
End Sub
End Module
Файл vb_ide_01.sln
аналогичен .vbp-файлу проекта в VB6. В этом файле хранится вся служебная информация,
необходимая для компиляции решения, в том числе описание всех проектов и файлов
решения. Примерное содержимое этого файла приведено ниже:
Microsoft Visual
Studio Solution File. Format Version 7.00
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}")
= "vbjdejl", _
"vbjide_01\vb_ide_01.vbproj".
"{F40E94D3-09CA-4E17-90EA-7A514E991F93}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}")
= "vb_ide_02". _
"vb_ide_02\vbjde_02.vbproj",
"{926DC073-167F-49DO-8A30-AF27E27BA2B4}"
EndProject
Global
GlobalSection(SolutionConfiguration)
= preSolution ConfigName.0 = Debug ConfigName.l = Release EndGlobalSection
GlobalSection(ProjectDependencies)
= postSolution EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution
{F40E9403-09CA-4E17-90EA-7A514E991F93}.Debug.ActiveCfg
= Debug|.NET {F40E94D3-09CA-4E17-9DEA-7A514E991F93}.Debug.Bui 1 d.0 = Debug|.NET
{F40E94D3-09CA-4E17-9DEA-7A514E991F93}.Release.ActiveCfg = Release].NET {F40E94D3-09CA-4E17-9DEA-7A514E991F93}.Release.Build.0
= Release].NET {926DC073-167F-49В0-8A30-AF27E27BA2B4}.Debug.ActiveCfg = Debug|.NET
{926DC073-167F-49D0-8A30-AF27E27BA2B4}.Debug.Build.0 = Debug|.NET {926DC073-167F-49D0-8A30-AF27E27BA2B4}.Release.ActiveCfg
= Release!.NET {926DC073-167F-49D0-8A30-AF27E27BA2B4}.Release.Build.0 = Release].NET
EndGlobalSection
GlobalSection(ExtensibilityGlobals)
= postSolution EndGlobalSection
GlobalSection(ExtensibilityAddlns) = postSolution EndGlobalSection
EndGlobal
Файл vb_ide_01.vbproj
написан на языке XML В нем хранится информация о проекте, в том числе значения
различных свойств. Для изменения свойств проекта обычно используется команда
Properties меню Project или контекстного меню, вызванного щелчком правой кнопщй
мыши в окне решения.
Язык
XML занимает очень важное место в .NET. Все объекты, создаваемые в .NET, по
возможности описываются (и даже передаются в Web) на языке XML.
Ниже приведено
содержимое файла проекта в текстовой форме. Обратите внимание на частое повторение
ключевого слова Assembly — это ключевое слово вместе с другими важными ключевыми
словами Imports и Namespaces рассматривается в главе 4:
<VisualStudioProject>
<VisualBasic
ProjectType
= "Local"
ProductVersion
= "7.0.9254"
SchemaVersion
= "1.0"
ProjectGuid = "{E24CC2EA-3E48-4C6E-8F92-ODE603B335D6}"
>
<Build>
<Sett1ngs
Applicationlcon
= ""
AssemblyKeyContainerName
= ""
AssemblyName
= "vb_ide_01"
AssemblyOhginatorKeyFile
= ""
AssemblyOriginatorKeyMode
= "None"
DefaultClientScript
= "JScript"
DefaultHTMLPageLayout
= "Grid"
DefaultTargetSchema
= "IE50"
DelaySlgn =
"false"
OutputType =
"Exe"
OptionCompare
= "Binary"
OptionExplicit
= "On"
OptionStrlct
= "Off"
RootNamespace
= "vb_ide_01"
StartupObject = "vb_ide_01.Modulel"
>
<Config
Name = "Debug"
BaseAddress
= "285212672"
ConfigurationOverrideFile=
""
DeflneConstants
= ""
DefineDebug
= "true"
DefineTrace
= "true"
DebugSymbols
= "true"
IncrementalBuild
= "true"
Optimize = "false"
OutputPath =
"bin\"
RegisterForComlnterop
= "false"
RemovelntegerChecks
= "false"
TreatWarningsAsErrors
= "false"
WarningLevel
= "1" /> <Config
Name = "Release"
BaseAddress
- "285212672"
ConfigurationOverrideFile
= ""
DefineConstants
= ""
DeflneDebug
- "false"
DefineTrace
= "true"
DebugSymbols
= "false"
IncrementalBuild
="false"
Optimize = "false"
OutputPath =
"bin\"
RegisterForComlnterop
= "false"
RemovelntegerChecks
= "false"
TreatWarningsAsErrors
= "false"
WarningLevel = "1"
/>
</Settings>
<References> <Reference
AssemblyName = "System"
/>
Reference
Name = "System.
Data"
AssemblyName = "System. Data"
/>
<Reference
Name = "System.
XML"
AssemblyName
= "System. Xml"
/>
</References>
<Imports>
<Import Namespace = "Microsoft. VisualBasic" />
<Import Namespace = "System" />
<Import Namespace = "System. Col lections" />
<Import Namespace = "System. Data" />
<Import Namespace = "System. Diagnostics" />
</Imports>
-</Build> <Files>
<Include>
<File
RelPath = "Assemblylnfo.vb"
SubType = "Code" . BuildAction = "Compile" /> <File
RelPath = "Modulel.vb"
SubType = "Code" BuildAction = "Compile"
/>
</Include> </Files>
</VisualBasic>
</Vi sualStudi
oProject>
Двоичный
файл vb_ide_01.suo содержит пользовательскую инфьрмацию уровня решения — в частности,
сведения об установленных точках прерывания и открытых документах. Если удалить
этот файл, все пользовательские настройки будут потеряны, но решение останется
работоспособным. В файле vbproj.user хранятся аналогичные параметры уровня проекта
(как и когда проект запускается, следует ли при компиляции создавать отладочную
версию и т. д.). Этот файл тоже написан на языке XML:
<VisualStudioProject> <VisualBasic>
<Build>
<Settings ReferencePath = "" >
<Config
Name = "Debug"
EnableASPDebugging = "false"
EnableASPXDebugging = "false"
EnableUnmanagedDebugging = "false"
EnableSQLServerDebugging = "false"
StartAction = "Project"
StartArguments = ""
StartPage = ""
StartProgram = ""
StartURL = ""
StartWorkingDirectory = ""
StartWithIE =
"false" />
<Config
Name = "Release"
EnableASPDebugging ="false"
EnableASPXDebugging = "false"
EnableUnmanagedDebugging = "false"
EnableSQLServerDebugging = "false"
StartAction = "Project"
StartArguments = ""
StartPage = ""
StartProgram = ""
StartURL = ""
StartWorkingDirectory = ""
StartWithlE = "false"
/>
</Settings>
</Build>
<OtherProjectSetti
ngs
CopyProjectDestinationFolder = ""
CopyProjectUncPath = ""
CopyProjectOption = "0"
ProjectView = "ProjectFiles"
/>
</VisualBasic>
</VisualStudioProject>
В существующее
решение можно легко добавить новый проект — откройте решение и выполните команду
File > New > Project. На экране появляется знакомое диалоговое
окно New Project (рис. 2.17), но если внимательно присмотреться к нему, вы заметите
два новых переключателя. При установке переключателя Close Solution, как и прежде,
новый проект создается в новом решении. Но если установить переключатель Add
To Solution, IDE включает новый проект в открытое решение.
Рис.
2.17. Включение проекта в существующее решение
Допустим,
вы установили переключатель Add to Solution и выбрали, как и прежде, консольное
приложение (Console Application). Как видно из рис. 2.18, в решение yb_ide_01
включается новый проект с именем vb_ide_02. Таким образом, полученное решение
vb_ide_01 состоит из двух проектов: vb_ide_01 и vb_ide_02, и его можно рассматривать
как аналог группы проектов VB6. Входящие в решение проекты могут взаимодействовать
друг с другом и использоваться для тестирования компонентов (например, в IDE).
Рис.
2.18. Объединение нескольких проектов в одном решении
Как упоминалось
в главе 1, программа .NET в процессе ^компиляции сначала переводится на промежуточный
язык IL, а затем компилируется в машинный код. Допустим, вы решили построить
исполняемый файл на базе решения vb_ide_01.
В рассмотренном
примере задействованы две единицы компиляции — наши два проекта. Исполняемый
файл может строиться на основе любого проекта, входящего в решение, а проекты
компилируются независимо друг от друга. Чтобы откомпилировать проект, проще
всего щелкнуть правой кнопкой мыши на одном из проектов в окне решения и выбрать
команду Build или Rebuild в контекстном меню. При выборе команды Build компилятор
ограничивается построением частей проекта, изменившихся с момента последнего
построения, а команда Rebuild строит заново весь проект. Команда Build используется
чаще, поскольку она работает быстрее (при запуске проекта клавишей F5 выполняется
команда Build, а не Rebuild).
Результаты
компиляции и построения проекта отображаются в окне вывода. На рис. 2.19 приведены
выходные данные для проекта vb_ide_01.
Рис.
2.19. Окно вывода при успешном построении
На этот раз
компиляция прошла успешно, но бывает и иначе. На рис. 2.20 показано сообщение
об ошибке, полученное при вызове несуществующей функции.
Рис.
2.20. Окно вывода при обнаружении ошибок
В режиме
фоновой компиляции VB .NET строка программы, содержащая ошибку, подчеркивается
волнистой линией. Подробную информацию — значительно более полную, чем в VB6,
— можно получить в окне вывода и в списке задач (рис. 2.21).
Если
дважды щелкнуть в одной из строк списка задач, в окне программы появляется фрагмент,
содержащий ошибку.
Рис.
2.21. Получение информации об ошибках в списке задач
Иногда бывает
удобнее откомпилировать сразу несколько проектов решения вместо того, чтобы
компилировать их по отдельности. В таких ситуациях применяются средства пакетной
компиляции VB .NET. Команда Build > Build Solution компилирует все
проекты, входящие в решение. Она часто используется в конце работы над приложением,
когда все готово к формированию окончательного пакета для распространения (эта
тема рассматривается в главе 13).
Команда Batch
Build позволяет выбрать проекты для компиляции. Она особенно удобна при работе
над несколькими проектами, если вы не хотите подолгу ожидать выполнения команды
Build All или компилировать каждый проект по отдельности. На рис. 2.22 показано,
как выглядит окно вывода при использовании команды Build Solution для решения
vb_ide_01.
Рис.
2.22. Информация о результатах пакетной компиляции
Из рисунка
видно, что оба проекта нашего решения были удИешно построены. Если бы в процессе
построения возникли какие-либо ошибки, их описания появились бы в окне вывода.
При выполнении
команды Build > Batch Build появляется диалоговое окно, показанное
на рис. 2.23. Если решение состоит из нескольких проектов и в одном-двух из
них возникают ошибки, вы по достоинству оцените эту команду.
Рис.
2.23. Выбор проектов для пакетной компиляции
Многие параметры
проектов задаются в диалоговом окне — щелкните на имени проекта в окне решения
правой кнопкой мыши и выберите команду Properties (также можно воспользоваться
командой Project > Properties). На экране появляется диалоговое окно,
изображенное на рис. 2.24. В этом разделе рассматриваются важнейшие параметры
компиляции, но мы рекомендуем самостоятельно исследовать остальные параметры,
находящиеся на вкладках Common Properties и Configuration Properties. В частности,
они позволяют:
По
умолчанию сборке и пространству имен назначаются имена, соответствующие имени
вашего решения. Пробелы в этих именах недопустимы, поэтому VB .NET автоматически
заменяет их символами подчеркивания.
Познакомившись
с разными способами компиляции проектов и решений, мы переходим к описанию параметров
компиляции отдельных проектов. Щелкните правой кнопкой мыши на имени проекта
в окне решения и выберите команду Properties > Configuration Properties >
Build — на экране появляется окно для настройки параметров
компиляции. Например, параметр Debugging позволяет задать аргументы командной
строки.
Рис.
2.24. Диалоговое окно свойств проекта
По сравнению
с VB6 параметров совсем немного. Впрочем, жалеть об этом не нужно: многое из
того, чем в VB6 приходилось заниматься вам, в CLR делается автоматически. В
частности, в параметрах компиляции можно указать, нужно ли создавать отладочную
информацию (см. следующий раздел), определять константы DEBUG и TRACE и выдавать
предупреждения [Очень трудно представить ситуацию, в которой отключение предупреждений
было бы оправдано.]. Константы DEBUG и TRACE выполняют те же функции, что
и в VB6: они позволяют использовать в программе команды условной компиляции:
#If DEBUG Then
Debug.WriteLine("In
debug mode")
#End If
#If TRACE Then
Trace. WhteLirie( "Tracing")
#End If
Если константа
DEBUG не определена, то проверка в первой строке не проходит и команда Debug.WriteLine
не выполняется. То же самое происходит и при проверке константы TRACE.
В категории
Optimizations списка Configuration Properties можно отключить проверку целочисленного
переполнения — впрочем, делать это нежелательно. Вероятно, Microsoft добавит
новые способы оптимизации в окончательной версии VB .NET или в дополнениях.
Отладочная и окончательная версии
В верхней
части диалогового окна Project Properties > Configuration Properties >
Build находится раскрывающийся список Configuration, состоящий из трех пунктов:
Release (Окончательная версия), Debug (Отладочная версия) и All Configurations
(Все конфигурации). При помощи этого списка можно задавать разные наборы параметров
для разных типов компиляции. Например, когда работа над приложением близится
к концу, в окончательной версии можно изменить некоторые из параметров, установленных
ранее в отладочной версии. Для этого следует выбрать в списке пункт Release
и произвести дополнительную настройку. Кнопка Configuration Manager позволяет
задать параметры компиляции сразу для нескольких проектов.
Обычно
различия между версиями сводятся к включению отладочной информации или разрешению/запрету
оптимизаций. Мы рекомендуем в процессе разработки использовать отладочную конфигурацию,
а затем построить итоговый вариант продукта в окончательной конфигурации. Например,
в отладочной конфигурации можно включить режим интерпретации предупреждений
как ошибок («Treat warnings as errors»), а в окончательной конфигурации
— отключить его.
Что же получается
в результате компиляции проекта? На рис. 2.25 показана структура каталогов,
сгенерированных IDE для решения vb_ide_01.
Рис.
2.25. Дерево каталогов после компиляции
Как упоминалось
выше, исходные файлы хранятся на верхнем уровне иерархии, в каталоге vb_ide_01.
В каталог bin помещаются двоичные файлы, полученные при компиляции, — в нашем
примере создаются файлы с расширениями .ехе и .pdb. Файл с расширением .pdb
содержит отладочную информацию и создается только в том случае, если отладочная
информация была затребована в диалоговом окне параметров компиляции (Project
> Configuration Properties > Build).
В этом разделе
приводится краткий обзор изменений в средствах отладки VB .NET. Мы вернемся
к этой важной теме позже, когда у нас появится содержательный код для отладки.
К сожалению, начинать приходится с печального известия. Если раньше VB позволял
прервать работу программы, отредактировать ее и продолжить выполнение с учетом
внесенных изменений, то начиная с бета-версии 2 эта возможность не поддерживается.
Программу можно редактировать в процессе отладки, однако изменения вступают
в силу лишь после повторной компиляции. Впрочем, различные средства пошагового
выполнения и прерывания программ (такие как условные точки прерывания) работают
так же, как и прежде.
И все же
можно с уверенностью сказать, что существование общего отладчика уровня VS .NET,
по своим возможностям сравнимого с отладчиком VC++, является одним из самых
заметных усовершенствований VB .NET на фоне предыдущих версий VB. Значительно
расширились возможности работы со всеми составляющими приложения, вплоть до
отладки на уровне загруженных модулей и программных потоков.
Для
работы отладчика необходим файл .pdb с отладочной информацией. Чтобы создать
этот файл, необходимо установить флажок Generate symbolic debug information
в диалоговом окне параметров компиляции. По данным файла .pdb отладчик определяет,
какая строка исходного текста соответствует текущей позиции исполняемого файла
и какие символические имена были присвоены переменным программы. Без отладочной
информации неполадки придется искать в ассемблерном листинге.
Отладчик
VB .NET обладает некоторыми новыми возможностями, отсутствовавшими в VB6. Краткая
сводка этих возможностей приведена ниже.
Окно памяти
предназначено для просмотра фактического содержимого заданной области памяти.
Ни в одной из прежних версий VB не поддерживалась эта возможность, чрезвычайно
полезная в некоторых ситуациях — например, если вы хотите проследить за выполнением
низкоуровневого кода и выяснить, что же именно происходит при работе
вашей программы. Окно памяти вызывается в IDE командой Debug > Windows
> Memory > Memory1 (или 2-4). Примерный вид окна памяти показан
на рис. 2.26. Если щелкнуть в окне памяти правой кнопкой мыши, появится контекстное
меню, в котором выбирается представление выходных данных.
С технической
точки зрения в любом сеансе отладки всегда задействован некоторый процесс (о
процессах рассказано в главе 10). В предыдущих версиях VB отладчик не позволял
подключаться к работающим процеЪсам — такая возможность была предусмотрена только
в отладчике Visual C++. В VB .NET команда Debug > Processes выводит диалоговое
окно, показанное на рис. 2!27.
Рис.
2.26. Окно памяти
Рис.
2.27. Выбор процесса для отладки
Чтобы начать
отладку, выделите процесс в списке и щелкните на кнопке Attach. После подключения
к процессу кнопка Break выводит информацию о текущем состоянии приложения. Если
отладочная информация отсутствует, выводится листинг на языке ассемблера. После
нажатия кнопки Attach на экране появляется диалоговое окно, в котором вам предлагается
выбрать, что же вы собираетесь отлаживать — машинный код, код CLR, сценарий
и т. д. В большинстве случаев отлаживается либо машинный код, либо код CLR.
Длл примера мы запустили экземпляр приложения Notepad.exe и подключились к нему
в отладчике VB .NET. Результат показан на рис. 2.28.
Рис.
2.28. Отладка процесса Notepad.exe
Листинг выглядит
устрашающе, поскольку мы не располагаем отладочной символической информацией
для программы Notepad.exe. При наличии этих данных в окне появился бы фрагмент
исходного текста функции, выполнявшейся в момент передачи управления отладчику.
В отладчике
VB .NET предусмотрено еще одно важное средство — просмотр всех выполняемых потоков
(threads) приложения. Переключение потоков в отладчике играет очень важную роль
в отладке многопоточных приложений. Мы вернемся к этой теме в главе 10 при знакомстве
с многопоточным программированием.
На первый
взгляд управление исключениями кажется экзотикой, не связанной с практической
работой. Чтобы оценить эту возможность по достоинству, достаточно оказаться
в ситуации, когда на стадии тестирования возникают многочисленные исключения
(см. главу 7) и возникает необходимость в тонкой настройке действий, выполняемых
при возникновении исключений. Это делается в диалоговом окне, вызываемом командой
Debug > Windows > Exceptions. В этом окне вы указываете, как должен
действовать отладчик при обнаружении исключений определенного типа. Допустим,
вы хотите, чтобы при возникновении ошибок доступа управление передавалось отладчику.
В результате
отладчик будет автоматически вызываться при возникновении ошибок доступа (0xc0000005),
и вы сможете точно определить, в какой строке программы это произошло.
Отладка управляемого и неуправляемого кодов
Управляемым
(managed) в .NET называется код, выполняемый при участии CLR. В управляемом
коде нельзя использовать указатели, а выделением/освобождением памяти занимается
CLR. Неуправляемый код не подчиняется этим ограничениям. Он может создаваться
в C++ и С#, но в VB .NET такая возможность не поддерживается.
Управляемый код усложняет работу некоторых средств отладки. Дело в том, что исполнительная среда CLR прикладывает значительные усилия к оптимизации выполняемого кода, что затрудняет получение правильных кадров стека (то есть адресов всех вызванных функций). Кроме того, в зависимости от специфики программы оптимизация может достичь такой степени, что отображаемый в отладчике код плохо ассоциируется с исходным текстом. Впрочем, по сравнению с преимуществами новой среды отладки VB .NET эти проблемы уходят на второй план.
Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.
Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").
Максимально, на что может претендовать "мысленный эксперимент" - это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.
Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.
Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.
|
![]() |