Как стать автором
Обновить

Невероятные приключения с Microsoft.Practices.Unity

Время на прочтение3 мин
Количество просмотров5.7K
Речь пойдет не о возможностях и вкусностях использования АОП, а об одном личном случае использования Unity в своем проекте.

Немного предыстории


Для нужд автообновления нескольких клиентских приложений была написана собственная библиотека, которая проверяет наличие обновлений и в отдельном потоке выполняет обновление. Использование библиотеки на клиентах сведено к минимуму.

Собственно история


И вот, в один прекрасный момент, после применения очередного обновления. У далекого клиента в г. Омск стали наблюдаться странные «тормоза» при запуске нашего приложения. Программа висела примерно 30-40 секунд, потом успешно запускалась и в дальнейшем работала с привычным для нас быстродействием.
Хм… Стал смотреть код.

Есть класс, реализованный как синглтон:

  1.     private static readonly UpdateManager instance = new UpdateManager();
  2.  
  3.     /// Статический конструктор необходим для отложенной инициализации статических полей
  4.     /// (инициализация происходит непосредственно перед первым обращением).
  5.     /// Следовательно конструктор не инициализируется до точки входа Main().    
  6.     static UpdateManager()
  7.     {
  8.     }
  9.  
  10.     private UpdateManager()
  11.     {
  12.       Инициализация
  13.     }
  14.  
  15.     public static UpdateManager Instance
  16.     {
  17.       get { return instance; }
  18.     } 
* This source code was highlighted with Source Code Highlighter.


Есть вызов из клиенского приложения:

  1. UpdateManager.Instance.InitializeNotifyIconForm();
* This source code was highlighted with Source Code Highlighter.


Дак вот, при вызове возникает непонятный лаг, в 30 сек,. определил по трассировке
Workplace Information: 0: Начало выполнения метода Workplace.Workplace.InitializeNotifyIcon. Текущее время: 09.12.2011 14:15:48

Krista.FM.Client.Workplace Information: 0: Метод Workplace.Workplace.InitializeNotifyIcon выполнен успешно. Затраченное время — 30154 мс. Текущее время: 09.12.2011 14:16:18

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

Framework Information: 0: Начало выполнения метода Framework.UpdateManager..ctor Текущее время: 09.12.2011 14:16:18

Вопрос: что делается в это время?


Стал вспоминать, что такого нового появилось, что может вызывать тормоза. Вспомнил, что начал использовать библиотеку Microsoft.Practices.Unity.

Оказывается эта библиотечка имеет цифровую подпись.

Во время инициализации приложения. NET Common Language Runtime (CLR) проверяет для подписанных сборок не аннулирован ли сертификат. Для этого естественно требуется достув к Internet. Если сервер недоступен, например, из-за брандмауэра или отсутствия подключения к сети, CLR, в конечном отваливается по таймауту, это может занять от 15 до 30 секунд.

Возможные решения, которые были найдены в сети.

Решение от Infragistics.

1. Настроить файервол, дать пользователю интернет. Сразу отпадает, клиентов много, в правах они, как правило, ущемлены.
2. Отключить опцию Internet Explorer Сервис — Свойства обозревателя — вкладка Дополнительно — опция Проверять аннулирование сертификатов. Проверил – работает. Но тоже не вариант, нужны права администратора и не забывать это проделать для каждого нового клиента. Клиентозависимое решение. В топку.
3. Установить сертификат локально. Действителен только в течение 10-15 дней. Вариант отпадает.
4. Использовать неподписанную версию dll. Для Microsoft.Practices.Unity просто такой не нашел. Еще используем компоненты Infragistics, дак они уже давно об этом позаботились и поставляют две версии библиотек. Bin и Bin-Signed
5. Скачал исходники Unity перекомпилировал библиотеку без подписи естественно. Работает. Но в нашем проекте еще используются зависимые от Unity проекты. Microsoft.Practices.ServiceLocation.dll, Unity.AutoRegistration.dll. Надо перекомпилировать и их. Так себе вообщем вариантик.
6. Пытался убрать из готовой dll цифровую подпись. Это возможно. Но как то муторно. Тоже так себе вариант, хотя может и рабочий
7. И вот оно, решение! В NET 3.5 элемент generatePublisherEvidence, который отключает проверку сертификата. Поверил, работает! Остается добавить только в config:

  1. <сonfiguration>
  2.   <runtimе>
  3.    <gеneratePublisherEvidence enabled="false"/>
  4.   </runtimе>
  5. </сonfiguration>
* This source code was highlighted with Source Code Highlighter.


Уже потом нашел две истории аналогичные моей:

Первый случай
Второй случай

Вот такая она не простая бывает безопасность.
Теги:
Хабы:
+32
Комментарии8

Публикации

Изменить настройки темы

Истории

Работа

.NET разработчик
72 вакансии

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн