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

Я и сам придумал не один способ, как обмениваться данными между серверной и клиентской частью контрола. Но всегда догадывался, что есть более простой и "правильный" путь, особенно, когда смотрел на реализацию контролов из набора AjaxControlToolkit,

Реализация интерфейса IScriptControl, который состоит из 2-х методов, помагает реализовать нужную задачу в несколько строк кода (не считая, конечно-то ещё нескольких строчек на JavaScript).

 

 

  • В методе GetScriptDescriptors() мы создаём дескрипторы в которых говорим какие клиентские свойства должны быть у контрола.
  • Метод GetScriptReferences() возвращает список клиентских скриптов, которые нам нужны и будут автоматически загружены с помощью ScriptManager.
С серверной стороной мы практически закончили, осталось только добавить несколько строк в обработчики событий OnPreRender и Render:

 

С серверной стороной закончили. Теперь осталось совсем немного написать на JavaScript. Как всегда, большую часть за нас сделала Microsoft. Добавляем в проект js-файл типа AJAX ClientControl:

Для нас создастса уже готовый прототик контрола, где нам останется только объявить все наши свойства, getters & setters для них, события и методы. 

Не могу сказать что описаннный способ лучше(выше, быстрее) других, но он позволяет легко создавать серверные комнонеты с клиентской частью и избавить себя от многой рутинной работы. Также, значительно приятнее смотреть на более-менее стандартизовынный код, пусть даже этот стандарт создан разработчиками из Microsoft.

Хочу заметить, что всё описанное выше без каких-либо изминений можно применять только для WebControl. Если же нужно сделать UserControl, то в нём нужно поместить какой-либо контейнер (e.g. <div id="container" runat="server"></div>) и при создании дескрипторов указывать ID контейнера, иначе вы получите клиентскуб ошибку что не к сему привязать js объект.

Более подробно о каждом шаге можно почитать по ссылке http://en.csharp-online.net/Creating_Custom_ASP.NET_AJAX_Client_Controls—IScriptControl.GetScriptDescriptors_Method и в MSDN.

ScriptControlTest.zip (7.95 kb)


Случилось так, что на работе попросили составить список из того, что нужно почитать/скачать/установить студентам, которые хотят писать на всеми любимом языке программирования C#. Решили, что раз они (студенты) этим интересуются, то вопрос "а оно нам(им) надо пропускаем.

Для начала начала необходимо установить сам .NET framework и какуе-то IDE. C IDE вариантов не много: или бесплатные express версии (http://www.microsoft.com/exPress/), или trial полнофункциональной Visual Studio (http://www.microsoft.com/visualstudio/en-us/default.mspx). Что дальше делать с триальной версией - каждый решает сам, но для студентов полно всяких програм, где можно получить всё это бессплатно и, главное, легально.

При установки Visual Studio рекомендую сразу поставить SQL Server Express Edition (http://www.microsoft.com/express/sql/default.aspx), т.к. я с трудом представляю какое более-менее большое приложение может работать без базы данных.

Из-за того, что упор делается на web-разработку, разу ставим Microsoft Web Platform Installer (http://www.microsoft.com/web/downloads/platform.aspx) - в нем уже есть всё нужное для разработки на платформе ASP.NET.

Всё установили, настроили - теперь можно писать свою первую (или не первую) программу на .NET. Вот только ещё не известно как писать! Предлагаю список литературы.

On-line сточники:

  • MSDN (Microsoft Developers Network): http://msdn.microsoft.com/en-us/default.aspx или русская версия http://msdn.microsoft.com/ru-ru/default.aspx. Там действительно есть всё, но использовать его в качестве учебника трудно и неудобно.
  • http://www.asp.net/learn/ - много разного обучающего видео, демонстрирующего возможности ASP.NET. К каждому ролику можно скачать исходный код проекта, на случай, если что-то не получается. Только не стоит увлекаться: там показывают только самые(!) простые вещи, которые в больших приложения требуют хорошей обработки напильником.
  • http://www.asp.net/community/projects/ - Starter Kits – готовые приложения с исходниками. Не знаю что ещё можно об этом сказать. Очень полезная вещь.
  • Всевозможные блоги, форумы, сообщества. Их сейчас очень много, т.ч. я не считаю что нужно их сдесть перечислять, всё-равно кому-то что-то не понравится.
  • ...
Книги:
  • Эндрю Троелсен. Язык программирования С# 2008 и платформа .NET 3.5 - своеобразный букварь по C#. Многие рекомендуют начинать именно с него.
  • Книги по ASP.NET от Дино Эспозито - у него несклько книг, ориентированных на разный уровень читателей, каждый может выбрать себе книгу "по душе".
  • Джеффри Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C# - отличнай книга, обязательна к прочтению каждым разработчиком, который пишет на .NET. Только я очень не(!) рекомендую начинать именно с неё. У меня было "тяжелое детство": начинал с Рихтера, поэтому пришлось читать 2 или 3 раза, чтобы понять о чём он пишет.
  • ...
Для начала, наверное хватит. To be continued...

 


Всё началось с того, что на один из тестовых серверов поставили 64-х битную ОС. Особых проблем это не вызвало, за исключением того, что обна из сборок использует COM -объекты и появилась необходимость её сборки для платформы x86. Вот сдесь уже начали появляться первые подводные камни.

Первым делом я в свойствах проекта поменял свойство Platform Target (посже оказалось что это нужно сделать для всех проектов в solution):

 

 
Но после этих изменений ошибка "Can not load assembly ..." не пропала.  Следующим шагом пошел смотреть свойства solution и...
 
 
... и, с удивлением, обнаружил, что в качестве Target Platform для всех проектов стоит "Any CPU", вместо необходимого "x86". Пришлось идти в Configuration Manager и создавать ноую платформу для текущего solution.
 
 
Но и после всех этих танцев с бубном сайт не заработал. Тут я решил заглянуть в настройки IIS, попутно вспониная создателей Microsoft, .NET и их родственников: и это вы называете кроссплатформенной средой? Здесь меня тоже ждал сюрприз в качестве одного из параметров Application Pool'а, а именно - Enable 32-Bitt Applications, который, по умолчанию, чтоб его конечно же равен False.
 
 
Хорошо что хоть это помогло, иначе я уже был готов перустанавливать Windows и/или избавляться от старой библиотеки, которая использует COM(в нашем случае можно обойтись без этого).
 
P.S. Немного оффтопа. Стало интересно, как это всё сможет работать на x64 системах, который вовсю сейчас продвигаются Microsoft. Ещё интересно где обещанная мультиплатформенность .NET? IMHO, считаю что её нет она находится в зачаточном состоянии, т.к. всё ещё можно скомнилить сборку толоько под x86 или x64. Понимаю, что это делалось только для "нормального" запуска exe-файлов, но зачем же это было делать такой ценой?

PlatrormTestWeb.zip (10.01 kb)


Все же знают (или не все?), что .net, по умолчанию, хранит строки в юникоде. Так почему же  я во всех примерах вижу такой код?

 

byte[] byteArray = GetBytes();
var retval = Encoding.ASCII.GetString(byteArray);

 

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

 

"\u0000"\u0000a\u0000"\u0000:\u00002\u00000...." 

 

Тогда все начинают громко ругаться и рвать на себе волосы со словами: "Ну ведь работало же! Да и вот в этом(http://www.google.com.ua/search?rlz=1C1GGLS_enUA335US335&sourceid=chrome&ie=UTF-8&q=c%23+byte+array+to+string) примере так написано!".

Хорошо, если мысль о неправильной кодировке прийдёт сразу, а если нет... Сколько времени/нервов потритит разработчик, прежде чем всё станит на свои места?

вышеприведённый пример лучше заменить на:

byte[] byteArray = GetBytes();
var retval = Encoding.Unicode.GetString(byteArray); 

Или даже на:

 

byte[] byteArray = GetBytes();
var retval = Encoding.Default.GetString(byteArray); 

 

 

 



Вчера в Киеве прошла конференция Patterns & Practices Roadshow. Изначально она должна была пройти в офисе Microsoft Ukraine, но, т.к. было многожелающих, провели её в Киевском кукольном театре. Очень красивое место и здание. Из названия было понятно, что будет обсуждаться Enterprice Library (EntLib), Entity Framework и всем, что связано с P'n'P. Догадки подтвердил опубликованный список ресурсов. 

Началось всё со вступительного слова представителя компании Microsoft Ukraine. Хотя, на самом деле всё началось с регистрации, где нам вдали пакеты с анкетой, ручкой и каким-то учебником для ВУЗов на украинском языке и кофе.


Первый доклад имел гордое название "Patterns & practices – взгляд в будущее", автором которого был Ajoy Krishnamoorthy, ведущий специалист группы patterns & practices в Microsoft, а в прошлом - PM продукта Visual Studio Team System. Было небольшое введение на тему "что такое Patterns & Practices, EntLib".

 

Вторым на сцену вышел Don Smith, которого встретили бурными авациями в том числе и из-за его Mac Book Pro, на котором оказалась установленная Windows 7.


Тут доклады немного пеменялись местами и мы услышали  доклад "Руководство по архитектуре приложений: карта вашего путешествия", который должен был быть после обеда. Но хуже от этого не стало. Нам рассказали о "Application Architecture Guide", котором написано, что он создан для разработки решений на платформе .NET, но, по сути, может быть использован при использовании и других технологий. Это же нам подтвердил Дон. Application Architecture Guide рассазывает нам о высокоарзхитектурных решениях, не вдаваясь в подробности реализации конкретных частей приложений. Думаю, что это будет интересно не только архитекторам, но и всем разработчикам. Поэтому рекомендую прочесть этот почти 400-страничный мануал.

Следующим был доклад нашего земляка Григория Мельника (Grigori Melnik).

Началось с приветствия и фразы "решил не выпендриваться и говорить на русском" (дословно). Было интересно послушать про EntLib 5,в которой будет поддерживаться совместимость до 2-й версии. Таким образом, если вы испульзовалм более старую версию библиотеки, то вы практически без проблем перейдёте на EntLib 5. К сожалению, из-за большого количества вопросов, доклад получился не полным. Григорий успел рассказать в общих чертах об Enterprice Library и рассказал о таких её частях, как Logging и Unity. Очень хотелось послушать ещё о Exception Handling и Data Access, который не является очередной ORM. Эту тему немного затронули в другом докладе, посвященному доступу к данным.

Обед. После обеда снова появился Don Smith и с докладом "Современные методы доступа к данным: шаблоны и реализации". Опять был сделан упор не на конкретную реализицию, а на то, какие вообще могут быть DataLayer. Немного была затронута тема Entity Libraкy и  LINQ to SQL. Несколько примеров приложений с разными архитектурами data layer хорошо продемонстрировали то, что Дон рассказывал и показывал на слайдах. 

Подводя итог, хочу сказать что конференция понравилась, не жалко потраченных времени/денег. Докладчики хорошо разбираются в сути вопроса и, что немаловажно, не просто говорят какие их технологии классные и нужно использовать их, а просто говорят какие есть плюсы, а иногда и минусы, тех  или иных подходов. Не было сказано не одной фразы похожей на "это классно, используйте наши технологии". Всё было достаточно объективно. Что касается организации, то не было привычных всем футболок, зато в обмен назаполенную анкету давали флешку с материалами конференции, на которой, к слову, не оказалось показанных презентаций и примеров проггрмамм, которые использовали докладчики. Так же не было EntLib 5, которая ещё не вышла в RTM.

P.S. Mike Chaliy, спасибо за фото.


internal class LinqConnection: BaseDatabaseConnection
{

   /// <summary>
   /// Should never be called
   /// </summary>
   internal LinqConnection()
   {
       throw new Exception();
   }
   ...

 

Написали программисты из США. И это ещё далеко не самый плохой кусок кода в проекте....


Раньше всегда это делал настолько автоматически, что даже и не задумывался что это млжно делать по-другому. Но когда столкнулся с такой проблемой в текущем проекте - решил написать.

 Рассмотрим такую ситуацию: у нас есть главная сборка (Main), сборка с утилитными классами (Utils) и 3-rd party логгер (Logger):

 

При этом Utils достался нам ещё со староко проекта и мы просто подключили его проект в наш solution, а логгер - соответствующий компонент из Microsoft Enterprise Library.
 
Решение этой задачи разбивается на следующие шаги:
  1. Добавляем в наш solution нужные нам проекты.
  2. Добавляем ссылки на проекты.
Почему-то, некоторые выбирают такой способ решения: выполняют шаг 1 - тут у нас только один способ сделать это (я не беру в счёт способ ручного редактирования *proj-файла), Build -> Rebuild Solution, и собственно добавление ссылки на проект путём добавления ссылки на dll:


В таком случае, если вам сильно повезёт и такого в вашем solution будет не много, достаточно будет сначала сделать Build -> Rebuild Solution, после чего всё заработает, а если не повезёт... А если не повезёт прийдётся ещё руками настраивать project dependecies и писать не менее захватывающий сценарий для билдов.
 
Теперь рассмотрим как это делать правильно:
Добавляем ссылку не на сборку, а на проект в solution:
 

 
После чего всё выглядит так:
 
Таким образом все зависимости на проекты выставляются автоматически и нам больше не нужен бубун для сборки solution и билдов.
 
Осталось подключись сборку с логгером. Но и здесь не всё так просто. В случае с Enterprise Library достаточно добавить ссылка на сборку из GAC:

У этого спосоа есть несколько недостатков: Enterprise Library должна быть установлена на всех машинах, где будет запускиться проект, и везде должна быть одна и таже версия. Второй недостаток хорошо ощёщается если использовать библиотеки, которые достаточно быстро развиваются и имеют множество версий (e.g. NUnit. AjaxControlToolkit, etc).
 
Я предпочитаю другой способ решения этой задачи (не могу сказать, что он не имеет недостатков, но, лично для меня, его преимущества имеют больший вес).
Все сторонние библиотеки кладутся в Source Control и уже на них ссылаются все проекты. Для удобства можно ещё создать папку в solution:

ReferencesSample.zip (76.14 kb)


Те, кто знает на память книгу Дж.Рихтера C# via .NET, в этом врядли найдут для себя что-то новое/интересное.
 

 Всё началось с того, что было у меня два похожих enum'ов (к примеру Numbers и BigNumbers) и нужно было как-то переменные первого типа приводить к другом, и наоборот. 

enum Numbers
    {
        One,
        Two,
        Three
    }

    enum BigNumbers
    {
        One,
        Two,
        Three,
        Four,
        Five
    }
На практике такие преобразования выглядят примерно так :
Numbers n1 = Numbers.One;
Numbers n2 = (Numbers) 2;
Int32 i1 = (Int32) n1;

BigNumbers b1 = BigNumbers.Five;

Numbers n3 = (Numbers) b1;

Console.WriteLine(String.Format("n1 = {0}", n1));
Console.WriteLine(String.Format("n2 = {0}", n2));
Console.WriteLine(String.Format("i1 = {0}", i1));
Console.WriteLine(String.Format("b1 = {0}", b1));
Console.WriteLine(String.Format("n3 = {0}", n3));
 

В результате на экране мы получим следующее:

n1 = One
n2 = Three
i1 = 0
b1 = Five
n3 = 4 

  Здесь мы видем, что n3 теперь равняется 4-м. Логичный, но не совсем ожидаемый для меня результат. В таком случае хотелось бы получить какой-то Exception.

 Теперь разберёмся что представляет собой enum и почему он так работает.

Enum (перечесляемый тим, enumerated type) предоставляет нам возможность хранить пару имя-значение и пришли в дополнение к константом (например: вместо того, чтоб в методе возвращать код ошибки, можно создать enum с именами ошибок).  По сути, System.Enum представляет обёкт размерного (value) типа, пронаследованного от System.ValueType:
 public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

И, по умолчию, запись  "enum Numbers" соответствует "enum Numbers : int". В этом можно убедится, посмотрев на наше приложение с помощью IL DASM, который входит в комплект поставки .NET Framework SDK.
.class private auto ansi sealed Enums.Numbers       extends [mscorlib]System.Enum{} // end of class Enums.Numbers
.field public static literal valuetype Enums.Numbers One = int32(0x00000000)

 
Таким образом мы видем, что все элементы нашего enum являются целыми числами (int). Вместо int, можно указать byte, sbyte, short, ushort, int, long, и ulong. Интересно что если указать имя типа так, как они именуются в FCL (Byte, Int32 и т.д.), то мы получим ошибку: 
 Type byte, sbyte, short, ushort, int, uint, long, or ulong expected
 
 
Вернёмся к нашему примеру. Чтоб в нём всё работало так, как ожидалось, достаточно добавить такой код:
 if (!Enum.IsDefined(typeof(Numbers), b1)){throw new ArgumentException();}

 

Enums.zip (3.01 kb)


Не успели мы ещё познакомитя с F# и новыми возможнастями .NET 4.0, как Microsoft представила новый язык программирования Axum (на самом деле Axum был представлен ещё до выпуска первой бета-версии .NET 4.0). Раньше он имел коддовое название Maestro.

Что же представляет собой Axum? Это язык для паралельной разработки (parallel model language), который позволяетлегко создавать легкомасштабируемые, распределённые и многопоточные приложения. Лично мне синтаксис этого языка напомнил Erlang, которые имеет изменённый синтаксис и является полностью .net-совместимым языком программирования. Текущяя версия - CTP. В данный момент не известно о дальнейшей судьбе и планах о релизе.

Чтобы посмотреть на этот язык вживую необходимо скачать небольшой 4.2МБ) плагин для Visual Studio 2008, на момент написание этого поста плагина для Visual Studio 2010 ещё нет. 



Так же с сайта Axum можно скачать спецификицию языка и руководство разработчкика на 42 и 36 страниц соответственно. Некоторую информацию можно узнать из блога команды разработчиков. Информации пока не много, но и её достаточно для знакомства с языкам и написанием приложений.

И на завершении, по традиции привожу пример "Hello World!".

 

  1. using System;
  2. using System.Concurrency;
  3. using Microsoft.Axum;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     public domain Program
  8.     {
  9.         private writer agent MainAgent : channel Microsoft.Axum.Application
  10.         {
  11.             public MainAgent()
  12.             {
  13.                 String [] args = receive(PrimaryChannel::CommandLine);
  14.  
  15.                 Console.WriteLine(String.Format("Hello, {0}!", args[0]));
  16.  
  17.                 PrimaryChannel::Done <-- Signal.Value;
  18.             }
  19.         }
  20.     }
  21. }
  22.  

Свершилось! Visual Studio 2010 and .NET Framework 4 Beta 1 качаем здесь, а отсюда качаем Visual Studio 2010 and .NET Framework 4 Training Kit - May Preview.