23 октября 2017 г.

Msbuild debugging. Отладка csproj скрипта проекта в Visual Studio.

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

Но выход есть! Скрипт MsBuild можно отлаживать, ставить breakpoints и смотреть значения переменных. Приведу ссылку на исходную статью Debugging MSBuild script with Visual Studio а тут опишу действия на примере Visual Studio 2015 и некоторые особенности.

Сборку и отладку придется запускать через командную строку msbuild.exe используя опцию /debug, но изначально данная функция не доступна, поэтому при попытке воспользоваться ключом будет ошибка:

D:\!Blog\DebugFeatures\DebugFeatures>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /debug DebugFeatures.csproj
Microsoft (R) Build Engine version 4.6.1055.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

MSBUILD : error MSB1001: Unknown switch.
Switch: /debug

For switch syntax, type "MSBuild /help"

Поэтому потребуется:
  • Сначала нужно добавить в ветку реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\4.0 значение DebuggerEnabled = true. На компьютере могут стаять две версии .NET Framework - под x64 и x86 поэтому для обоих свои ветки реестра. В статье выше указан путь только к одной ветке, поэтому я приведу текст написанного мной скрипта, который добавит это значение в оба места.

    SET FrameworkDir=%windir%\Microsoft.NET\Framework
    SET FrameworkDir64=%windir%\Microsoft.NET\Framework64
     
    SET Cmd32Exe=%windir%\System32\cmd.exe
    SET Cmd64Exe=%windir%\SysWOW64\cmd64.exe
     
    IF EXIST %FrameworkDir% (
     start %Cmd32Exe% /c "reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\4.0" /v DebuggerEnabled /d true"IF EXIST %FrameworkDir64% (
     start %Cmd64Exe% /c "reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\4.0" /v DebuggerEnabled /d true"
    )
    
    Для запуска скопируйте в блокнот, сохраните как AnyName.bat, затем запустите.
    
  • Затем идём в студию, выбираем проект и в контекстном меню выбираем пункт "Unload Project", проект должен стать "Недоступным":

  • Далее для запуска отладчика пишем в командной строке "Путь\msbuild.exe" /debug "Путь\MyProject.csproj", запускаем и должны увидеть:

14 октября 2017 г.

Симулятор игры "Жизнь" ("Game of life") на WPF

Все игры:

Исходный код:

Скачать




Game of life.zip
Скомпилированная версия

.NET Framework 4.0
Требуемая версия установленного Framework.

Однажды, просматривая видео на youtube, я наткнулся на крайне занимательный рассказ про клеточные автоматы. Они мне настолько понравилось, что захотелось самому увидеть их работу, а так же реализовать алгоритм на языке C#. Ссылка на то видео:


В нём достаточно хорошо все рассказано, поэтому в данной статье будет только краткое описание алгоритма и пример реализации.

Алгоритм (правила) работы клеточных автоматов.

Действие разворачивается на бесконечном поле в решётку. На каждом кадре анимации (называемом поколением), мы обходим все ячейки и вычисляем количество стоящих по периметру закрашенных клеток. Посчитав, выполняем два правила:
  1. Клетка закрашена. Если вокруг клетки ровно 2 или 3 закрашенные клетки, тогда с ней ничего не случается и она живёт, иначе становится пустой.
  2. Клетка пустая. Если вокруг ровно 3 закрашенные клетки, тогда в клетке зарождается жизнь и она становится закрашенной.

Пример на C# + WPF.


Исходный код своего проект я разместил на bitbucket.org, ссылка на проект размещена в начале статьи. Так же можно скачать (выше) собранную версию, но для её работы необходимо наличие предустановленного .NET Framework 4.0.

Интерфейс программы:



7 сентября 2017 г.

WCF System.Diagnostics логирование в реальном времени

https://bitbucket.org/sergey_vaulin/wcftracker/src
Скачать проект.


Оглавление:

  1. WCF service. С чего начать. Основные моменты создание службы. 
  2. WCF. Callback через BasicHttpBinding без дуплексной связи.
  3. Realtime WCF Tracker вызовов клиентского приложения.
  4. Как отключить публикацию метаданных mex WCF сервисом. 

Введение


При разработке не раз была потребность понять, кто вызывает в конкретный момент мой сервис с клиента. Для этого (лично я) у сервиса в каждом методе добавлял Breakpoint и далее производил TestCase, выясняя из каких мест на клиенте производятся вызовы по Call Stack. Или представьте, когда происходит какая то проблема, не на вашем компьютере, влияющая на отзывчивость приложения и вам надо найти подозреваемого, а значит понять дело в сервере или клиенте путём анализа вызовов.
Для этого можно в приложении включить полную троссировку вызовов, воспользовавшись Trace Viewer (Using Service Trace Viewer for Viewing Correlated Traces and Troubleshooting) но он пишет все в лог файл, при этом требует каких то действий для настройки его на клиенте. Не спорю, его может быть достаточно, но там будет лог всех сообщений за время работы  клиента и в этой куче не сразу найдёшь что было вызвано в нужный интервал времени. Но хочется, что то на уровне - нажал - посмотрел вызовы, нашёл что надо - закрыл, отключил.

WCF Tracker в реальном времени.


Хочу представить альтернативный вариант, который, помимо возможности видеть все вызовы, имеет возможность ставить breakpoint.

Демонстрация работы: