Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В двадцать третьем выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов,


Информационный Канал Subscribe.Ru

.Net Собеседник #23

Содержание
  1. От автора
  2. Обзор новостей
  3. Статья выпуска - Как обезопасить свои сборки
  4. Время кода - Пустой ListView в C#
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Хочу представить вам предварительный анонс первого номера журнала «Алгоритм» (это примерно 2/3 объёма первого номера).

- интервью с А.Гладченко
- А.Гладченко «Резервное копирование в репликации SQL Server»
- В.Веденин «Работа с Crystal Reports в приложениях .Net»
- М.Прохоров «Как правильно работать с Excel в .NET»
- М.Сухов «Технологии построения распределенных приложений в .NET»
- Д.Орлов «Подсистема сопоставления записей в Хранилище Данных»
- Б.Джоши, С.Топорков «Передача значений между веб-формами в ASP.NET»
- Козарь К. «Что нам стоит построить мост между .NET и Visual Fox Pro?»
- Чужа В.Ф. «Делаем отчёты в .Net своими руками»
- Чужа В.Ф. «System.Object в отражении глаз Саламандры»

Приглашаю авторов разместить в журнале свои статьи. Основная тематика – программирование, особенно приветствуются статьи о программировании на платформе .Net, программирование и администрирование СУБД MS SQL Server, Oracle, Interbase и т.д.
Подписку для граждан России можно оформить здесь.
Подписку для юридических лиц России можно оформить здесь.
Подписку для граждан и юридических лиц Украины можно оформить здесь.
Подробнее можно посмотреть здесь.
Контактный адрес электронной почты – vfc@ppdmn.com .

Желаю приятного чтения.

{К содержанию}

Обзор новостей

  1. TallComponents выпустила версию бесплатную версию 1.1 компонента ASP.NET для рендеринга PDF пиктограмм. Доступна демо-версия в онлайне.
    TallComponents серьёзно улучшила свой компонент для рендеринга страниц PDF в виде изображений для браузера (макс. 18 DPI). Компонент бесплатен как для коммерческого, так и для некоммерческого использования.
  2. Dundas Gauge для .NET предлагает разработчикам ещё одну улучшенную настройку визуалиции данных
    Dundas Software объявила о выходе новой линейки улучшенных компонент для визуализации данных - Dundas Gauge for .NET. Dundas Gauge позволяет разработчикам добавлять в свои приложения хорошо настраиваемые шкалы различной формы.
  3. devAdvantage 2.1 теперь доступен с обработкой исключений C#
    devAdvantage соединяет возможности инструментов рефакторинга и анализаторов статического кода, может детектировать и исправлять проблемы на основе проверенных практик на C#, стандартов кодирования и т.п.
  4. Выполнение длительных операций – ч.1
    Часто выполнение веб-приложений заканчивается выдачей ошибки "time out". Есть приемлемые пути выхода из этой ситуации, которые и обсуждаются в первой части этой статьи.
  5. Компонент Nevron Chart для ASP .NET
    Nevron LLC сообщает о выходе очередной версии компонента Nevron Chart для ASP .NET.
  6. RichDatePicker v1.5 для ASP.NET
    RichDatePicker v1.5 предлагает продвинутый пользовательский интерфейс для выбора даты и времени в приложениях ASP.NET. Поддерживает финансовые периоды, такие как Q1, Q2 и т.д.
  7. ComponentOne объявила о выходе ComponentOne Response для Embedded Self-Service
    ComponentOne объявила о выходе новой версии ComponentOne Response, которая позволит разработчикам ПО включать Self-Service в приложения. При использовании этого инструментария конечный пользователь может получить доступ к онлайновым базам знаний без закрытия своего основного приложения.
  8. Ускорьте разработку приложений с помощью DataAide 1.0
    DataAide ускорит разработку ваших приложений путём генерирования стандартных хранимых процедур CRUD SQL Server и предлагая лёгкое генерирование слоёв доступа к данным на VB6 и .NET. Многие другие инструменты также включены в этот набор, который бесплатен и доступен по адресу http://dataaide.sourceforge.net.
  9. Axosoft выпустила OnTime Defect Tracker V4.2
    В OnTime V4.2 появилось множество разных отчётов, позволяющих командам разработчиков и тестировщиков анализировать дефекты и готовность продукта к выпуску. Доступна бесплатная однопользовательская версия и бесплатный SDK.
BUGs, FIXes and HOW TO's -
  1. You may receive an "Unable to connect to" error message when you try to debug a process through a firewall on a remote computer
  2. Some files in the Dllcache folder may not be updated when you run the Setup program for Microsoft Data Access Components
  3. Programmatically check for canonicalization issues with ASP.NET
  4. The Start Page of the IDE appears to be incomplete in Visual Studio .NET 2002
  5. You may require more than 300 MB of free disk space to install the October 2003 Visual Studio .NET Documentation Update
  6. PRB: You may not be able to establish an SIP session with audio between RTC clients

{К содержанию}

Статья выпуска


Как обезопасить свои сборки

ЯЗЫК: C#
АВТОР: Ссылка на отзыв
Код к статье : Демонстрационный проект

ПЕРЕВОД: Чужа В.Ф ака hDrummer

Вступление

Что заставляет людей воздерживаться от использования вами написанных сборок?

Это был один из первых вопросов, которые я задавал себе разбираясь с .NET. В хорошо написанном куске кода всё полезное должно быть доступно другим – всё полезное не только в одном приложении, а во всех приложениях, написанных какой-то конкретной компанией. Обычно это достигается использованием общего кода. До .NET, с этой целью обычно использовали Win32 DLL или COM DLL. В .NET таже философия реализована в виде сборок, которые являются теми же DLL.

Почему же нужно использовать эту философию, а не просто копировать классы из одного проекта в другой? Одним из преимуществ является то, что DLL (будь она Win32, COM, или сборкой .NET) может быть протестирована на ошибки. Раз проверив её, любая компания может с уверенностью её использовать;это ускоряет разработку и ведёт к созданию более стабильных программ. Если же в библиотеке найдут ошибку, то исправив её, мы автоматически исправляем её во всех приложениях, где она используется.

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

Не секрет, что использование классов из пространства имён System.Security может помочь решить некоторые из этих проблем.

Использование Strong Names

Главный способ защиты сборки от атаки – использование строгого имени (strong name) сборки. Строгое имя представляет из себя пару ключей (строк чисел)— один закрытый и один открытый. Закрытый ключ находится внутри сборики и является недоступным. Открытый же доступен всем. Вобщем, эта пара используется для шифровки: открытый ключ используется для зашифровки потока данных, а закрытый – для расшифровки, если, конечно, он у вас есть.

Генерация ключей происходит с помощью утилиты sn.exe, которая генерирует эту пару и сохраняет её в файле. Эта утилита является частью .NET Framework SDK, так что, скорее всего, она у вас есть, если вы занимаетесь разработкой на платформе .NET.
Используется этот инструмент так:
sn -k <keyfilename>.snk
Для того, чтобы подцепить ключевой файл с сильным именем к сборке (к DLL или exe – всё равно), отредактируйте файл AssemblyInfo, в котором замените атрибут AssemblyKeyFile вашим файлом .snk. Например,
[assembly: AssemblyKeyFile("mykeyfile.snk")]
Если вы делаете это и для своих сборок и для исполняемых файлов, используйте один и тотже ключевой файл, эти сборки не могут быть в этом случае заменены после компиляции другими без привязки их к той же паре ключей в файле SNK. Это и предотвратит замену сборки вашего приложения другой сборкой, которая сможет собирать данные без вашего ведома.

Атрибуты доступа к коду

Есть несколько атрибутов, которые вы можете использовать вместе с вашими классами для того, чтобы предотвратить их несанкционированное использование. Все они являются наследниками System.Security.Permissions.CodeAccessSecurityAttribute. Здесь я приведу пример использования одного из них - StrongNameIdentityPermissionAttribute. Для использования этого атрибута вам для начала необходимо извлечь открытый ключ из файла .snk. Делается это с помощью утилиты Secutil.exe.

Если вы исполните такую команду для своей .dll, которая имеет прицепленный файл .snk:
secutil -hex -c -s <yourassembly>.dll

То увидите примерно следующее:

Microsoft (R) .NET Framework SecUtil 1.1.4322.573

Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

Public Key =
0x002400000480000094000000060200000024000052534131000400
0001000100B7E269CFBC5A020745C65DD01E39A01FC4819125A52265
186DB13D82B947B5745AC14CC11EAD50A6DE94B1BA7E2973867298C6
BB031A86DB0570BF8E12D08A98DF6D2609258449D3A10AE89165222E
F04A9B15BF7E896BB317B383137F12B3A93D928EA43720739BB62A22
0508BF4FD2E20F1CFE0FF63888FC25B6A1E0EABABD
Name =
Assemblies.File
Version =
1.1.0.0
Success


Вам нужен открытый ключ, поэтому лучше его вывести в файл, который потом можно открыть с помощью NotePad:

secutil -hex -c -s <yourassembly>.dll > key.txt

Если в сборке есть класс, который вы хотите оградить от использования, для этого можно использовать атрибут StrongNameIdentityPermissionAttribute. Любой код, который не подписан нижеуказанным образом вашим файлом .snk, с использованием открытого ключа для примера, не получит доступ к классу:

[StrongNameIdentityPermissionAttribute(SecurityAction.Demand,
PublicKey = "002400000480000094000000060200000024000052534131000400" +
"0001000100B7E269CFBC5A020745C65DD01E39A01FC4819125A522" +
"65186DB13D82B947B5745AC14CC11EAD50A6DE94B1BA7E29738672" +
"98C6BB031A86DB0570BF8E12D08A98DF6D2609258449D3A10AE891" +
"65222EF04A9B15BF7E896BB317B383137F12B3A93D928EA4372073" +
"9BB62A220508BF4FD2E20F1CFE0FF63888FC25B6A1E0EABABD")]
public class MyClass
{
public MyClass()
{
}
}

Этот атрибут может быть добален или на уровне класса или на уровне метода. В добавок, вы можете выбрать, когда ваш атрибут будет проверяться: в MSDN для этого есть несколько альтернатив. Вы выбираете одну из них путём передачи соответствующего значения SecurityAction. Признаюсь, что мне удалось заставить работать только SecurityAction.Demand и SecurityAction.LinkDemand.
SecurityAction.Demand— в этом случае условие проверяется при каждом создании объекта класса или при каждом вызове метода, в зависимости от того, к чему прицеплен атрибут – к методу или классу.
SecurityAction.LinkDemand— в этом случае условие проверяется при обработке аттрибутированного кода JIT-компилятором. Это случается только раз, поэтому, вероятно, более эффективно.

Выводы

Итак, мы рассмотрели как можно защитить наш код от замены хакером или от несанкционированного использования нашей сборки. В действительности существует гораздо больше атрибутов кода, которые можно использовать – я же поработал только с одним. В добавок вы можете написать и свои атрибуты доступа к коду – но это уже тема отдельной статьи.

Вот и всё, удачного программирования!

{К содержанию}

Время кода

Пустой ListView в C#

ЯЗЫК: C#
АВТОР: Lubos Haskohttp://www.hasko.com.au/blog/
Код к статье : Демонстрационный код к статье

ПЕРЕВОД: Чужа В.Ф ака hDrummer

Вступление

Не удивляло ли вас, каким образом отображается текст в элементе управления ListView, если он пуст, например так, как это делается в Microsoft Outlook Express или других похожих приложениях?

За кулисами

OnPaint() работать не станет

Если вы подумали насчёт использования события OnPaint() – забудьте. Компонент ListView – всего лишь обёртка для элемента управления из библиотеки ComCtl и не генерирует это событие.

UserControl: на 100% чистое решение на C# - но сложное

Можно использовать такой подход – сделать свой собственный пользовательский комопонент с ListView и меткой (Label) поверх него, которая будет видна только тогда, когда ListView пуст. Однако есть маленькая проблема – при изменении размера столбцов отрисовывается чёрная линия под меткой, что выглядит очень уж непрофессионально. Конечно, можно закрыть меткой всю площадь Listview, но тогда окажется, что не всегда видны полосы прокрутки. Вобщем, решив одну проблему – получаем другую и т.д.

Использование кода

Возможно наилучшим решением будет перегрузка метода WndProc примерно таким образом. Если m.MSG == 20, Listview вызывает функцию перерисовки своего фона, а мы просто сверху нарисуем нашу строчку, если компонент пуст.

protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == 20)
{
if (this.Items.Count == 0)
{
_b = true;
Graphics g = this.CreateGraphics();
int w = (this.Width - g.MeasureString(_msg, this.Font).ToSize().Width)/2;
g.DrawString(_msg, this.Font, SystemBrushes.ControlText, w, 30);
}
}
}

Вобщем то, что надо, но со временем мы заметим, что это решение не является идеальным. При изменении размеров всего Listview или одной колонки, часть строки будет видна вне области это колонки, что выглядит просто по-ламерски. Вот и улучшенный метод WndProc, в котором решена эта проблема:

protected override void WndProc(ref Message m) {
base.WndProc(ref m);
if (m.Msg == 20)
{
if (this.Items.Count == 0)
{
_b = true;
Graphics g = this.CreateGraphics();
int w = (this.Width - g.MeasureString(_msg, this.Font).ToSize().Width)/2;
g.DrawString(_msg, this.Font, SystemBrushes.ControlText, w, 30);
}
else
{
if (_b)
{
this.Invalidate();
_b = false;
}
}
}

if (m.Msg == 4127) this.Invalidate();
}

// Не забудем перерисовать весь элемент управления при событии Resize и отобразить
//нашу строку

private void ListView2_Resize(object sender, EventArgs e)
{
if (_b) Invalidate();
}

Вот и всё.


{К содержанию}

Форумы .Net на SQL.RU - вопросы оставшиеся без ответа

Программное создание отчета Crystal из .NET
Не запускается приложение
Назначение и считывание значений переменных в цикле...
по Microsoft ACT
Как заставить .NET Framework устанавливаться вместе с приложением
Ошибка с ODBCConnection
почему не происходит изменения данных на сервере
Открытие диалога с выбранным путем на PPC
yield




На этом двадцать третий выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное