Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Выполнение перехода от VВ к C# требует специальной подготовки, но стоит того, так как методология C# позволяет не только кодировать приложения, которые можно сделать в VB но также множество других приложений которые было бы трудно или невозможно создать в VB хорошо структурированными и легко поддерживаемыми. При использовании C# можно также получить дополнительный бонус среды выполнения .NET и всех связанных с этим преимуществ. 

Приложeниe D

Параметры компиляции C#

Это приложение перечисляет различные параметры компиляции C#, которые можно применять, если необходимо компилировать проекты C#, не используя возможности Visual Studio.NET, или если необходимо выполнить операции компилятора, не поддерживаемые Visual Studio.NET. Они организованы как последовательность таблиц, составленных согласно категориям.

Первая таблица показывает различные форматы файлов, которые может выводить компилятор:

Параметр Назначение
/doc:<имя файла>
Обрабатывает комментарии документации XML (помеченные тремя слэшами —
///
) и выводит в указанный файл XML.
/nooutput
Компилирует код, но не создает файла вывода; полезно для отладочных целей, так как консоль будет показывать предупреждения и ошибки.
/out:<имя
файла>
Определяет имя файла вывода. Если оно не указано, то компилятор создает стандартный файл .exe с тем же именем, что и у исходного файла (кроме расширения).
/target:<option> /t:<option>
Определяет формат файла вывода в одном из четырех вариантов:
exe
: создает стандартный исполняемый файл (задание по умолчанию).
library
: создает код библиотеки (DLL).
module
: создает модуль кода (сборку без манифеста), который позже добавляется к сборке (с помощью
/addmodule
).
winexe
: создает исполняемый файл для Windows.

Если только не определен параметр

/target:module
, компилятор будет добавлять манифест в создаваемый ЕХЕ файл (или первый файл DLL, если ЕХЕ не создается). Отметим, что
/target
можно сократить до
/t
.

Следующая таблица объясняет параметр командной строки для определения оптимизации компилятора.

Параметр Назначение
/optimize<+ | -> /о<+ | ->
Включает или выключает оптимизацию, выполняемую компилятором для создания более короткого, быстрого и эффективного вывода. Отключено по умолчанию. Чтобы включить, применяйте синтаксис:
/optimize
или
/optimize+
Чтобы выключить, применяйте синтаксис:
/optimize-

Следующая таблица описывает параметры, которые используются, когда создают и ссылаются на сборки .NET.

Параметр Назначение
/addmodule:<модуль>
Определяет один или несколько модулей, которые будут включены в указанную сборку. Если модулей более одного, то они разделяются с помощью точки с запятой. Этот параметр недоступен в Visual Studio.NET
/nostdlib<+ | ->
Определяет, нужно или нет импортировать стандартную библиотеку (
mscorlib.dll
), которая импортируется по умолчанию. Если желательно реализовать свое собственное пространство имен и классы
System
, то компилятор не будет загружать стандартную библиотеку. Синтаксис для этого выглядит следующим образом:
/nostdlib
или
/nostdlib+
Синтаксис для импортирования следующий:
/nostdlib-
/reference:<сборка> /r:<сборка>
Импортирует метаданные из файла сборки. Можно определить полный путь доступа к сборке, или определенный везде с помощью переменной окружения
PATH
, либо относительный путь начинающийся в текущем проекте. Если имеется больше одного файла, они разделяются посредством точки с запятой.

Следующая таблица объясняет параметры, которые применяются при отладке и контроле ошибок.

Параметр Назначение
/bugreport <имя файла>
Создает указанный файл, который содержит всю информацию об ошибках, выданную компилятором. Содержимое файла включает: копию всего исходного кода, листинг параметров компилятора, информацию о версии компилятора, операционной системе и т.д., всю выдачу компилятора, описание проблемы и возможное решение (по желанию). Эта возможность недоступна в Visual Studio.NET.
/checked<+ | ->
Определяет, даст ли превышение над заданным значением целого числа ошибку времени выполнения. Это применимо только к коду вне области действия блоков
checked
и
unchecked
. Отключено по умолчанию. Синтаксис для контроля переполнения следующий:
/checked
или
/checked+
. Чтобы отключить контроль переполнения, используйте следующий синтаксис:
/checked-
/debug<+ | -> /debug:<option>
Создает информацию отладки. Чтобы включить, используйте синтаксис:
/debug
или
/debug+
. Чтобы отключить, используйте:
/debug-
. Отладка отключена по умолчанию. Если определить, что должна выводиться информация отладки, то имеются две возможности в отношении типа создаваемой информации отладки:
/debug:full
: разрешает соединение отладчика с операционной системой.
/Debug:pdbonly
: разрешает отладку исходного кода, когда программа запускается в отладчике, но будет выводить только ассемблерный код, когда выполняющаяся программа присоединяется к отладчику.
/fullpaths
Определяет полный путь доступа к файлу, содержащему ошибку. Эта возможность недоступна в Visual Studio.NET.
/nowarn:<number>
Подавляет способность компилятора создавать специальные предупреждения. Параметр
number
определяет, какой номер предупреждения подавить. Если определено более одного, то они разделяются запятыми. Это параметр недоступен в Visual Studio.NET.
/warn:<option> /w:<option>
Задает минимальный уровень предупреждений, который желательно выводить. Параметр
option
показывает: 0: Подавление всех предупреждений. 1: Вывод только серьезных предупреждений. 2: Вывод серьезных предупреждений и предупреждений среднего уровня. 3: Вывод серьезных предупреждений, предупреждений среднего и низкого уровня. 4: Вывод всех сообщений, включая информационные предупреждения
/warnaserror<+ | ->
Интерпретирует все предупреждения как ошибки. Чтобы включить, используйте синтаксис:
/warnaserror
или
/warnaserror+
. Чтобы отключить, используйте синтаксис:
/warnaserror-
. Отключено по умолчанию.

Следующая таблица показывает, как задавать директивы препроцессора:

Параметр Назначение
/define:<name> /d:<name>
Определяет символ препроцессора, заданный с помощью
<name>
.

Эта таблица объясняет параметры, связанные с включением внешних ресурсов:

Параметр Назначение
/linkresourсе:<имя файла> /linkres:<имя файла>
Создает связь с указанным ресурсом .NET. Двумя необязательными дополнительными параметрами (разделенными запятыми) являются:
identifier
: логическое
имя ресурса; имя применяется для загрузки ресурса (по умолчанию используется имя файла),
mimetype
: строка, представляющая тип среды ресурса (по умолчанию используется
none
). Эта возможность недоступна в Visual Studio.NET.
/resource:<имя файла> /res:<имя файла>
Вставляет определенный .NET ресурс в файл вывода. Двумя дополнительными необязательными параметрами (разделенными запятыми) являются:
identifier
: логическое имя ресурса; имя используется для загрузки ресурса (по умолчанию используется имя файла),
mimetype
: строка представляющая тип среды ресурса (по умолчанию
none
).
/win32icon:<имя файла>
Вставляет указанный файл пиктограммы Win32 (.ico) в файл вывода.
/win32res:<имя файла>
Вставляет указанный файл ресурса Win32 (.res) в файл вывода. Этот параметр недоступен в Visual Studio.NET.

Заключительная таблица перечисляет смешанные параметры компилятора.

Параметр Назначение
@<имя файла>
Указывает файл, содержащий все параметры компилятора и исходные файлы, которые будут обрабатываться компилятором, как если бы они вводились в командной строке.
/baseaddress:<address>
Указывает предпочтительный базовый адрес для загрузки DLL. Значение
<address>
может быть десятичным, шестнадцатеричным или восьмеричным.
/codepage:<id>
Определяет кодовую страницу (значение, передаваемое как параметр
<id>
) для использования при компиляции всех файлов исходного кода. Вводите этот параметр, если в файлах C# применяется множество символов, не используемых по умолчанию в данной системе. Этот параметр недоступен в Visual Studio.NET.
/help /?
Передает параметры компилятора на стандартный вывод. Этот параметр недоступен в Visual Studio.NET.
/incremental<+ | -> /incr<+ | ->
Разрешает выполнять инкрементную компиляцию файлов исходного кода, которая компилирует только те функции, которые были изменены с момента предыдущей компиляции. Информация о состоянии предыдущей компиляции хранится в двух файлах — .
dbg
(или
.pdb
, если был определен параметр
/debug
) для хранения информации отладки и
.incr
для хранения информации о состоянии. Чтобы включить параметр, используйте синтаксис:
/incremental
или
/incremental+
. Чтобы отключить, используйте синтаксис:
/incremental-
. Этот параметр отключен по умолчанию.
/main:<class>
Определяет расположение метода
Main
, если в исходном коде существует более одного метода с таким именем.
/nologo
Подавляет вывод заголовочной информации компилятора. Этот параметр недоступен в Visual Studio.NET.
/recurce: <dir\file>
Поиск подкаталогов для исходного файла с целью компиляции. Имеются два параметра:
dir
(необязательный): каталог или подкаталог, из которого начинается поиск. Если не определен, то это каталог текущего проекта.
file
: файл или файлы для поиска. Можно использовать метасимволы.
/unsafe
Разрешает компиляцию кода, который использует ключевое слово
unsafe
.

C# Сегодня

Статья "Программное соединение событий в C#" взята из базы знаний на сайте C# Today www.csharptoday.com издательства Wrox. Код, используемый в статье, можно загрузить вместе с кодом для всей книги со страницы Professional C# на Wrox.com.

Программное соединение событий в C#

Мэттью Рейнольдс

Одним из наиболее мощных свойств .NET является возможность создания динамических форм для приложений Windows. Известные и раньше, сегодня они очень легко создаются в .NET. Это позволяет получать объекты, производные из

System.Windows.Forms.Control
, непосредственно во время выполнения, и использовать их точно таким же образом, как если бы они были созданы проектировщиком форм. Динамические элементы управления могут использоваться для настройки интерфейса пользователя приложения в зависимости от некоторой информации о среде выполнения, например административной утилиты базы данных, где кнопка динамически добавляется в утилиту для каждой таблицы, содержащейся в базе данных. Немного сложным моментом этой темы является соединение обработчиков событий с элементами управления. В этой статье показано, как динамически создавать элементы управления в C# и соединять методы с событиями элементов управления.

Создание проекта

Давайте создадим новый проект Visual C# — Windows Application и назовем его DynamicButtons.

Прежде всего необходимо скомпоновать базовую форму, которая выглядит следующим образом:

Пусть кнопка будет называться

cmdCreateButtons
, а текстовое поле —
txtLog
. Убедитесь, что в
txtLog
свойство
Multiline
задано как
True
, а свойство
ScrollBars
— как
Vertical
.

Когда будет нажата

cmdCreateButtons
, мы добавим к форме шесть кнопок, расположенных в пустом пространстве справа от
txtLog
. В то время как обработчики событий конфигурируются для новых кнопок, определим какая кнопка инициирует вызов. Здесь нужно, чтобы все кнопки имели дополнительные целые свойства с именем ID, которые при создании пронумерованы от 1 до 6.

Одной из отличительных черт .NET, к которой разработчикам VB необходимо привыкнуть, является идея наследования существующих классов из Framework (Среды разработки) и их расширение. Эта техника является очень эффективной. В данном случае необходимо создать новый класс с именем

DynamicButton
и наследовать его из
System.Windows.Forms.Button
. Это означает, что наш новый класс будет обладать всей функциональностью обычного элемента управления
Button
, но при этом иметь и другие свойства, которые нам понадобятся, в частности новое свойство с именем
DynamicID
. Так как этот класс является производным из
Button
, он выполняет все действия, присущие элементу управления кнопки, т. е. реагирует на нажатия, может быть помещен в форму и т.д.

Более того, действительно важный аспект наследования состоит в том, что любой знающий, как использовать

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

Поделиться с друзьями: