вторник, 17 апреля 2012 г.

Полуавтоматическая генерация кода

Сегодня я хочу поговорить об автоматической генерации кода C#. Например, свойства в классах, описывающих сущности предметной области, обычно описываются по совершенно одинаковой схеме. И мне элементарно лениво писать для каждого примитивного свойства одинаковые конструкции. Немного спасает применение сниппетов и активных шаблонов, но когда приходит нужда что-то поменять в этой схеме, то приходится перелопачивать кучу кода. Так почему бы это однообразие не генерировать автоматически в процессе сборки?
В какой-то момент кинетическая энергия творчества ненадолго пересилила потенциальную энергию лени, и результатом этого стала маленькая библиотечка для автоматической генерации некоторых исходных файлов программы на основе внешних данных. Приглашаю под кат всех ленивых (в хорошем смысле этого слова) разработчиков на C#.

суббота, 10 марта 2012 г.

Представление метаданных с помощью перечислений

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

понедельник, 27 февраля 2012 г.

Не забудьте нажать релиз!

.NET чудесно интегрирована с COM. Разработчик может без лишних усилий, легко и просто загружать и использовать в своих программах COM объекты из других приложений. Но разница в способе управления памятью (сборщик мусора .NET и подсчет ссылок в COM) иногда подкидывает неприятные сюрпризы.

вторник, 31 января 2012 г.

Полезные расширения для работы с папками

Несмотря на стремительное развитие облачных технологий, простому программисту .NET никуда не деться от работы с файловой системой. Благодаря классам из пространства имен System.IO, работа с файлами и папками довольно проста и прозрачна. Но, все таки, некоторые простые (и довольно востребованные) операции требуют заметного количества манипуляций. Предлагаю вашему вниманию несколько методов-расширений для класса DirectoryInfo, которые слегка дополнят возможности по работе с папками.

пятница, 20 января 2012 г.

Расширения для класса FrameworkElement

Разработчики WPF (и Silverlight) меня поймут. Microsoft создала мощную технологию для создания пользовательского интерфейса декларативным образом. Но, к сожалению, не все можно реализовать декларативно. Приходится иногда и код месить. И вот тут ожидает неприятный сюрприз. Концептуально понятная иерархия интерфейсных элементов оказывается недоступной напрямую, а чтобы достучаться до неё приходится обращаться к классу VisualTreeHelper. Это, бесспорно, очень нужный и полезный класс, но использование методов типа GetChildrenCount() и GetChild() в эпоху LINQ несколько раздражает.

суббота, 14 января 2012 г.

Что такое искусство программирования?

imageНекоторое время назад я прочитал на хабре статью “Искусство программирования?”. Эта статья спровоцировала большую дискуссию в хабра-сообществе. У меня нет большого желания участвовать в дискуссии, но на определенные мысли эта статья меня натолкнула. Так является ли программирование видом искусства?

понедельник, 9 января 2012 г.

Командная разработка

imageНекоторое время назад мне посчастливилось побывать на концерте академического хора МГУ. Слушая их великолепное выступление, я невольно обратил внимание на поразительную схожесть хорового пения и командной разработки.

воскресенье, 18 декабря 2011 г.

Упрощаем обработку исключений

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

пятница, 9 декабря 2011 г.

Использование конвертеров значений в привязках данных WPF

Связывание данных (Data Binding) в WPF – очень мощный (правда, не всегда удобный) механизм. А возможность использование конвертеров дает возможность связывать интерфейс с данными почти любого вида. Несмотря на кажущуюся простоту явления, возможности, открываемые конвертерами, поистине безграничны.

среда, 7 декабря 2011 г.

Дополнительные материалы по использованию слабых ссылок

C#
В декабрьском номере журнала MS Developer вышла статья про использование слабых ссылок для уведомлений об изменений. Для тех кому интересен этот материал предлагаю ознакомиться с исходными кодами классов коллекций, которые упоминаются в статье.

воскресенье, 4 декабря 2011 г.

"Магия" Linq

imageЯ неоднократно наблюдал, что начинающие разработчики относятся к Linq (да и вообще к многим фреймворкам), как к некоторой магии. Они используют “заклинания”, получают требуемый результат – и все. При этом многие даже не пытаются понять, что же происходит за кулисами изящных синтаксических конструкций, считая это безумно сложным, низкоуровневым и недоступным простым смертным.

четверг, 24 ноября 2011 г.

Анимация времени

При реализации гладкой прокрутки шкалы времени в диаграммах мы с коллегами столкнулись с необходимостью анимировать свойства зависимостей, тип которых DateTime. Но оказалось, что стандартных классов для анимации свойств такого типа не предусмотрено. Сначала мы попробовали использовать класс ObjectAnimationUsingKeyFrames, однако, чтобы анимация выглядела гладко, приходится добавлять много ключевых кадров, а это, в свою очередь, приводило к большому количеству изменений свойства и частым перерисовкам, перерасчетам привязок. В общем, выглядело не очень красиво.

суббота, 19 ноября 2011 г.

Централизованное управление командами в WPF

Когда я был начинающим программистом, то программировал с использованием библиотеки MFC. Мне очень нравилась предлагаемая MFC модель использования команд. Команда – это некоторый идентификатор. С идентификатором команды просто и естественно связываются строка подсказки, метод обработки доступности команды, метод для выполнения действия команды и т.п. Команды объявляются централизовано, обработчики команд не зависят от того, как была вызвана команда – программно, нажатием на кнопку в панели инструментов или через контекстное меню. Все было понятно и логично.

понедельник, 7 ноября 2011 г.

MessageBox + FlowDocument

После того как я познакомился с магией технологии WPF и, в частности, с возможностями отображения потокового содержимого, меня очень удивило отсутствие штатной возможности вывести пользователю простое сообщение с использованием FlowDocument. И, в некоторый момент, я в своем проекте реализовал простейший механизм для отображения таких сообщений.

среда, 2 ноября 2011 г.

Завершаем создание инсталляционного комплекта

После того как все файлы инсталлятора упакованы в один файл и UAC не задает лишних вопросов при установке, добавим последний завершающих штрих – на последней странице программы установки добавим галочку “Запустить программу”.К сожалению, стандартные средства Setup Project не позволяют это сделать.

пятница, 21 октября 2011 г.

Обновление манифеста приложения с командной строки

Одна из проблем использования самоустанавливающегося архива, создаваемого программой IExpress, под Windows Vista или Windows 7 с включенным UAC – это обилие вопросов о безопасности, которые задаются пользователю в процессе установки. Эти вопросы возникают из за того, что в манифесте получаемого исполняемого файла указан требуемый уровень доступа как asInvoker, в то время как запускаемые в виде дочерних процессов программы установки требуют более высокого уровня доступа. Проблему можно решить, изменив манифест созданного IExpress приложения, указав более высокие требования.

среда, 19 октября 2011 г.

Продолжаем создание инсталляционного комплекта

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

Ожидание завершения всех процессов, запущенных из программы установки.

Это должна быть простая программа, которая не требует установки дополнительных компонентов, поэтому язык C# не подходит (на компьютере может отсутствовать .NET Framework). Я выбрал для её реализации С++ с использованием статической библиотеки STL.

понедельник, 10 октября 2011 г.

Создание средствами Microsoft установочного комплекта для публикации в Web

MS Visual Studio поддерживает специальный тип проекта для создания программы установки (Setup Project), позволяющий довольно гибко описать правила установки вашего приложения на компьютере пользователя. Получаемая в результате сборки такого проекта программа установки выполняет копирование файлов, добавляет нужные запись в реестр, создает ярлыки для запуска и, что особенно важно, устанавливает необходимые для приложения компоненты (Prerequisites). Установочный комплект, полученный в результате сборки состоит из пакета установщика Windows (файл с расширением MSI), исполняемый файл setup.exe (выполняет установку необходимых компонентов), установочные комплекты необходимых для установки приложений. Однако такой комплект невозможно опубликовать на Web-сайте, поскольку он состоит из нескольких файлов! Для решения это проблемы можно поступить одним из следующих способов:
  1. Использовать для сборки другое средство создания установочного комплекта.
  2. Заархивировать все файлы комплекта (например, с помощью ZIP) и опубликовать на сайте полученный архив.
  3. Превратить полученный установочный комплект в самораспаковывающийся архив, автоматически запускающий установку программы.

среда, 5 октября 2011 г.

Конвертер для получения пути к файлу из пути к папке и имени

Некоторое время назад передо мной возникла простая задача: вывести в текстовом поле полный путь к файлу, при том что в модели он был представлен двумя свойствами: путь к папке с файлом и имя файла. Разделение на два поля в модели было важным с архитектурной точки зрения, заводить дополнительное свойство для их объединения не хотелось. Объединить их требовалось только для отображения пользователю.

пятница, 30 сентября 2011 г.

Как в WPF приложении отобразить иконку файла

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