barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком C#. Показать все сообщения
Показаны сообщения с ярлыком C#. Показать все сообщения

пятница, 15 июня 2012 г.

Включение WCF Tracing

Для включения трэйсинга WCF-приложения в web.config / конфиг настолького приложения нужно добавить:
<configuration>
   <system.diagnostics>
      <sources>
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="traceListener"
                   type="System.Diagnostics.XmlWriterTraceListener"
                   initializeData= "c:\log\Traces.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
</configuration>

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

Base64 кодирование и декодирование в C# (и вообще в .NET)

Чтобы не изобретать велосипед, можно воспользоваться стандартной функцией:
String System.Convert.ToBase64String(byte[])
И наоборот:
byte[] System.Convert.FromBase64String(String)

Использование WIA Automation в C#

Во-первых, COM-объект wiaaut.dll нужно зарегистрировать в системе, делается это следующим вызовом (из-под администратора):
C:\Windows\system32\regsvr32.exe C:\Windows\system32\wiaaut.dll
Теперь в проекте C# добавляем ссылку на COM-объект. В русскоязычной MS Visual C# Express 2010 это "Обозреватель решений" -> Выбираем текущее решение и проект -> "Ссылки" -> Клик правой кнопкой -> "Добавить ссылку", где переходим на вкладку "COM" и ищем "Microsoft Windows Image Acquisition Library 2.0", после чего нажимаем "ОК".
Всё, теперь в проекте доступно пространство имен WIA, в котором расположены все необходимые интерфейсы. Посмотреть их можно, щелкнув правой кнопкой по "WIA" в Ссылках, и выбрав "Просмотр в обозревателе решений". Например, для получения цветного изображения со сканера  в формате BMP с минимизацией размера получаемого файла используется следующий код:

WIA.CommonDialog dlg = new WIA.CommonDialog();
WIA.ImageFile img = dlg.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, WIA.WiaImageIntent.ColorIntent,
WIA.WiaImageBias.MinimizeSize, "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}", false, true, false);
Вообще с WIA Automation как-то грустно всё в плане толковой документации и рабочих примеров, особенно на C#, или, не дай Бог, на C++ (есть кое-что на мсдн, но этого явно недостаточно). Как её использовать на чистом (не CLR) C++ я вообще не понял: ни заголовочного файла, ни tlb или idl я так и не нашел, а без них работать становится совсем неудобно. 

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

Создание подписи XML Signature, независимой от пространств имен, объявленных выше по иерархии по отношению к подписываемому узлу, но реально не использующихся внутри подписываемого поддерева

При использовании метода канонизации xml-документа "Canonical XML" (http://www.w3.org/TR/2001/REC-xml-c14n-20010315) получаемая подпись (здесь речь идет о случае, когда подписывается один узел xml-дерева, а не весь документ целиком) будет зависеть от пространств имен, объявленных в элементах выше по иерархии в дереве по отношению к подписываемому узлу, даже если эти пространства не используются внутри подписываемого поддерева. Таким образом, если контекст подписанного узла будет изменен (он будет перемещен в пределах этого же дерева или перемещен в другое xml-дерево), подпись может стать недействительна, если пространства имен, объявленные выше по иерархии, изменятся. В таких случаях нужно использовать метод канонизации "Exclusive Canonical XML" (http://www.w3.org/2001/10/xml-exc-c14n#), который не учитывает объявленные выше по иерархии пространства имен (кроме пространств имен, которые действительно используются внутри подписываемого поддерева, но объявлены выше по иерархии). В C# изменение метода канонизации делается указанием:

signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NWithCommentsTransform;
XmlDsigExcC14NWithCommentsTransform transform = new XmlDsigExcC14NWithCommentsTransform();
reference.AddTransform(transform );

В этом примере signedXml - объект SignedXml, представляющий подписываемую XML, reference - объект Reference, указывающий на подписываемый узел (для которого выполняется signedXml.AddReference(reference); перед вычислением подписи). В примере использован стандарт   "Exclusive Canonical XML with comments" (http://www.w3.org/2001/10/xml-exc-c14n#WithComments), корректно работающий с комментариями в XML.

четверг, 1 декабря 2011 г.

Сборка C# из командной строки

Для сборки cs-файлов без использования Visual Studio имеется утилита csc.exe, расположенная в директории вроде C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe. Пример вызова:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Security.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll  /target:library project.cs

четверг, 5 мая 2011 г.

Хранение параметров подключения к БД в конфигурационном файле в приложениях .NET

Строки подключения к БД можно хранить в конфигурационном файле (app.config для настольных приложений и web.config для ASP.NET), чтобы при изменении параметров доступа к БД не лазить все время в код программы.
Для этого в файл конфигурации добавляется тег вида:

  
    
  

После этого строка соединения будет доступна в программном коде следующим образом:

ConfigurationManager.ConnectionStrings["MainConnection"].ConnectionString

суббота, 23 апреля 2011 г.

C# - аналог ключевого слова synchronized для методов в Java

Иногда нужно, чтобы некоторый метод объекта выполнялся в каждый момент времени только одним потоком (т.е. чтобы вызовы к данному методу объекта сериализовывались, т.е. ставились в очередь). Для такого контроля конечно можно использовать, например, семафор, но в Java было предусмотрено специальное ключевое слово - synchronized. В C# есть аналогичная конструкция, которая, правда, не является частью языка:
using System.Runtime.CompilerServices;

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        protected void someSyncMethod() { ... }
Также как и в Java, синхронизированными могут быть помечены сразу несколько методов класса, при этом, т.к. при вызове любого синхронизированного метода блокируется объект-хозяин, в любой момент времени возможно будет выполнение лишь одного из них.