Pull to refresh
56
0
Send message

English Exceptions в .NET

Reading time1 min
Views413
Как меня раздражает, когда в объяснении исключения идет локализованный перевод. Ошибку загуглить становится гораздо сложнее.

Но, как оказалось, можно загуглить как обрубить локализацию исключений:

Thread.CurrentThread.CurrentUICulture = new CultureInfo( "en-US" );

Все, исключения теперь английские.
Total votes 30: ↑17 and ↓13+4
Comments15

Программа из одного exe

Reading time4 min
Views42K
Как правило, при написании .NET программ используются не только классы из .NET BCL, но и сторонние библиотеки. Во время выполнения программы все используемые библиотеки должны быть найдены. Для этого зависимые dll кладут в одну папку с exe файлом.

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

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

Программа из одного EXE
Total votes 90: ↑75 and ↓15+60
Comments75

Тестирование по спецификации

Reading time11 min
Views34K
Недавно я писал про различные виды тестирования и про то, что интеграционное тестирование удобно производить с помощью спецификаций. В этой статье я покажу как именно происходит такое тестирование.

Спецификация — это текстовый файл с описанием того, что нужно протестировать в тестовых данных. В ней указывается какие результаты должна получить программа. Тестовый код находит реальные, вычисленные на живом коде результаты. А тестовый движок производит сверку спецификации и вычисленных результатов.

Такой подход позволяет декларативно создавать тесты. Спецификации легко читаются и дополняются при изменении требований. Тестовый код получается компактным. Его легко поддерживать и расширять.

В статье описаны принципы работы движка для тестирования спецификаций и приведены примеры использования. Сам движок прилагается к статье. Можно его считать небольшой библиотекой для интеграционного тестирования.
Тестирование по спецификации
Total votes 16: ↑11 and ↓5+6
Comments6

Виды тестирования и подходы к их применению

Reading time5 min
Views262K
Из институтского курса по технологиям программирования я вынес следующую классификацию видов тестирования (критерий — степень изолированности кода). Тестирование бывает:
  • Блочное (Unit testing) — тестирование одного модуля в изоляции.
  • Интеграционное (Integration Testing) — тестирование группы взаимодействующих модулей.
  • Системное (System Testing) — тестирование системы в целом.
Классификация хорошая и понятная. Однако на практике выясняется, что у каждого вида тестирования есть свои особенности. И если их не учитывать, тестирование станивится обременительным и им не занимаются в должной мере. Здесь я собрал подходы к реальному применению различных видов тестирования. А поскольку я пишу на .NET, ссылки будут на соответствующие библиотеки.
Подходы к тестированию
Total votes 57: ↑49 and ↓8+41
Comments12

Visual Studio Snippets

Reading time3 min
Views19K
Одно время я очень фанател от CodeRush. Он позволял в два-три нажатия клавиши создать свойство у объекта или составить тело цикла. Набирать код институтских лабораторных было одно удовольствие.

Потом вышла 2008 студия с C# 3.0 и там были автоматические свойства. Мне все больше не нравилось, когда CodeRush делал не то, что я хотел. Короткие шоткаты этому способствуют. И в один прекрасный момент я отказался от его использования. У меня больше времени тратилось на борьбу с инструментом, чем если бы я набирал код собственоручно.

Потом я узнал о сниппетах студии. По сути это те же шаблоны кода из CodeRush, только более простые. Есть стандартные вроде for, foreach, prop и exception. Чтобы их раскрыть нужно написать имя шаблона и нажать TAB. Если пользоваться автокомплитом, то можно написать часть имени шаблона, а потом TAB, TAB.
Про создание сниппетов
Total votes 20: ↑13 and ↓7+6
Comments10

Системные диалоги в .NET

Reading time2 min
Views2.2K
Недавно по работе искал как вызвать какой-то системный диалог из WPF. Оказалось, что в WPF такого диалога нет, но зато существует библиотека под .NET, которая позволяет вызывать системные диалоги.

Сайт библиотеки: www.ookii.org/software/dialogs


Читать дальше →
Total votes 16: ↑11 and ↓5+6
Comments4

Подсветка синтаксиса C# 3.0 в блогах

Reading time4 min
Views2.8K
У меня в планах написание серии статей по программированию. Примеров кода на C# будет много. А чтобы код читался, его надо подсвечивать.

Но подсветка синтаксиса пропадает при вставке кода в блог. Нужно использовать специальные программы для генерации HTML с эквивалентной подсветкой. Я знаю про два таких проекта — Ookii.FormatC и Source Code Highlighter.

Однако функциональности и того и другого мне не хватило. Мне нужна была возможность публикации в ЖЖ и на Хабре (то есть без использования css) плюс подсветка LINQ. Я решил модифицировать Ookii.FormatC и написал свой подсветчик синтаксиса.

Читать дальше →
Total votes 20: ↑13 and ↓7+6
Comments10

Visual Studio 2008 PowerShell Command Prompt

Reading time2 min
Views2.5K
Мне нравится PowerShell, он не в пример функциональнее и более читаем чем cmd. Но вот незадача — иногда приходится открывать командную строку Visual Studio, а она не PowerShell. Выполнять же из одной консоли ls и nmake хочется.

Как вариант можно было бы взять vsvars32.bat и переписать его, но это откровенное надругательство над свободным временем и есть путь проще —
blogs.msdn.com/domgreen/archive/2009/05/03/visual-studio-command-prompt-via-powershell.aspx. Я немного изменил скрипт, подчистив из него мусор.

Читать дальше →
Total votes 13: ↑7 and ↓6+1
Comments0

Быстрый доступ к оснасткам Windows

Reading time2 min
Views35K
Вводить в диалоге «Выполнить» (Win+R) или в поисковой строке Пуска (начиная с Vista, работает не для всего). Для домашних версий ОС некоторые оснастки могут отсутствовать.

ncpa.cpl — сетевые подключения. Всегда раздражало, что в Vista нет прямого доступа к сетевым подключениям, а смотреть свойства и включать/выключать сетевые интерфейсы надо. Для Windows 7 это менее актуально — там сеть как-то ближе.

compmgmt.msc — управление компьютером. Я часто захожу туда, чтобы посмотреть что расшарено, как размечены диски, чтобы остановить или перезапустить какой-либо сервис. Там же список устройств подключенных к компьютеру.

secpol.msc — политики безопасности. В WinXP SP2, помню, только там можно было поставить флаг чтобы компьютер мог быть перечислен в любом сетевом окружении. Для Vista более интересен флаг, который позволяет убрать UAC для админов. Если ты под админом, то не нужно постоянно подтверждать каждое свое действие. В Windows 7 по умолчанию настройки таковы, что изменения системных предпочтений не приводит к появлению окна UAC. Что сильно уменьшает желание его отломать =)

control userpasswords2 — хранящиеся в системе пароли. Здесь можно обнулить запомненный пароль. Более интересный вариант — возможность зайти в другую системы под другим аккаунтом. А то зайдешь на расшареное на другом компьютере, потом настройки безопасности перетрясешь — а стучишься по-умолчанию со старыми учетными данными.

msconfig — перечисление запускаемых при старте ОС программ. ИМХО лучше использовать Autoruns от SysInternals, но когда их нет, msconfig тоже может помочь отключить всякую гадость, которая тормозит старт системы.

rundll32.exe sysdm.cpl, EditEnvironmentVariables — переменные окружения. Да, запомнить невозможно. Но один раз введя в диалог выполнить, можно потом вызывать из истории команд.
Total votes 125: ↑71 and ↓54+17
Comments48

Energynet

Reading time4 min
Views545
Хочу поделится содержимым доклада, на который наткнулся в сети. Есть такой человек — Juval Lowy. Основатель Idesign, автор нескольких книг, региональный директор Microsoft в Silicon Valley. На Teched 2009 он выступил с докладом несколько нехарактерным для формата данного мероприятия. В нем Джувал предсказывает, что следующий IT бум произойдет очень скоро и будет связан с развитием рынка альтернативной энергии. Джувал аргументирует свою позицию и дает рекомендации разработчикам как подготовится к буму.

Читать дальше →
Total votes 3: ↑2 and ↓1+1
Comments10

LINQ to Events — декларативная работа с асинхронным интерфейсом

Reading time3 min
Views1.3K
Наткнулся на очень интересное расширение для LINQ позволяющее декларативно работать с асинхронным интерфейсом ( themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html ). Сейчас расширение существует как часть Silverlight Toolkit (Rx framework), но в последствии станет частью .NET 4.0 (System.Reactive.dll).

Идея в том, чтобы стереть границы между IEnumerable и IObservable интерфейсами (читай между Iterator и Observer паттернами). Асинхронные события представляются как последовательность данных, возвращаемых будто бы по yield return. А это в свою очередь позволяет работать с данной последовательностью через LINQ в функциональном, декларативном стиле.

Например, можно использовать LINQ для формулирования выражений о перетаскивании контролов:

IObservable<Event<MouseEventArgs>> draggingEvent =
    from mouseLeftDownEvent in control.GetMouseLeftDown()
    from mouseMoveEvent in control.GetMouseMove().Until(control.GetMouseLeftUp())
    select mouseMoveEvent;


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

Таким образом from позволяет декларативно описывать последовательность событий. В противном случае, потребовалось бы создавать конечный автомат и устанавливать флаг нажатия на левую кнопку мыши. А в обработчике перемещения мыши тестировать этот флаг и изменять поведение обработчика в зависимости от него. Использование же Rx фреймворка позволяет описать последовательность событий декларативно и не вводить дополнительные переменные.

Подобным образом можно тестировать GUI где переходы из состояния в состояние не мгновенны, а происходят с анимацией, окончания которой необходимо дождаться прежде чем производить обращения к свойствам контрола.

Rating rating = new Rating();
IObservable<Unit> test =
   ObservableExtensions
      .DoAsync(() => TestPanel.Children.Add(rating)) // добавить контрол на панель
      .WaitFor(TestPanel.GetLayoutUpdated()) // подождать пока появится
      .DoAsync(() => rating.Value = 1.0) // установить свойство
      .WaitFor(
         rating
            .GetActualValueChanged() // ждать пока не установится
            .SkipWhile(actualValueChangedEvent => // новое значение свойства
               actualValueChangedEvent.EventArgs.NewValue != rating.Value))
      .Assert(() => rating.GetRatingItems().Last().ActualValue == 1.0); // Assert

// очистка ресурсов по завершению теста
test.Subscribe(() => TestPanel.Children.Remove(rating));


Автор оригинального поста обещает в ближайшее время осветить межпоточное взаимодействие с использованием этого фреймворка.

Области применения


  • Построение КА для визуального интерфейса пользователя.
  • Координирование событий Workflow.
  • Координирование сообщений с периферийными устройствами. В том числе с сетью (веб-службами) и с любым асинхронным IO.
  • Работа с цепочками событий.

Адаптация под WPF


silverlight.codeplex.com/SourceControl/ListDownloadableCommits.aspx
evain.net/blog/articles/2009/07/30/rebasing-system-reactive-to-the-net-clr

Похоже, ветки кода, адаптированной под WPF, пока нет, но обещают добавить в .NET 4.0. Однако уже сейчас можно взять сырцы и поковырять вручную.

Bindable LINQ


Развитие идеи — осуществление биндинга к декларативно описанным цепочкам событий. При изменении зависимого свойства, GUI перерисовывается чтобы отразить изменения. В Rx этого сейчас нет. Однако подобная связь с INotifyPropertyChanged есть в следующих проектах (сами проекты пока не смотрел):
Total votes 47: ↑32 and ↓15+17
Comments6

Information

Rating
Does not participate
Registered
Activity