Теневое копирование библиотек

сложность 200

Меня периодически занимают вопросы о разных мелких трюках со сборками, как скрыть одну в другой, или как делается система плагинов. Так же очень давно меня занимает вопрос как загружать и использовать библиотеки так, чтобы код работал, а сам файл библиотеки можно было бы удалить. Честно сказать к вопросу этому я подходил раза 4 в течении года и все как-то безрезультатно, наверно плохо хотел получить результат, так как другого объяснения я не вижу, но наконец все получилось хорошо и быстро, о чем я и хочу рассказать.

Теневое копирование (Shadow Copy) – позволяет работать с заблокированными файлами. Приложение может блокировать и обычно блокирует все библиотеки которые были использованы/используются в процессе работы приложения, файлы с которыми ведется работа. Под работой может подразумеваться изменение, перезапись, удаление, переименование и так далее.

Зачем оно надо?

Теневое копирование позволяет приложению не зависеть от библиотеки расположенной в директории загрузки все время работы, так как она копируется в приватную директорию в профайле пользователя. Таким образом, например, работает IIS с ASP.NET приложениями.

На мой взгляд, данная технология может быть полезна в следующих случаях:

  • Система обновления приложения, когда надо обновлять библиотеки приложения и при полной загрузке их нельзя переписать.
  • Система плагинов для приложения.
  • Фокусы =)

После того, как определились что такое «теневое копирование» и зачем оно нужно, можно собственно перейти к обсуждению реализации.

Подробнее

Теневое копирование библиотек

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

MEF II

Продолжаем разговор о MEF и сегодня на повестке дня небольшие дополнения о экспорте/импорте, время жизни дополнений, способы создания дополнений, наследование дополнений.

Экспорт/импорт по контракту

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

С помощью контрактов, можно назначать дополнения на конкретные, заранее определенные поля, без привлечения фильтров и воборок в ручную.

Итак, пусть у нас есть все те же два дополнения. Теперь только мы объявим контракты к ним. Это делается очень просто:

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

Как видите, не надо теперь делать выборок по массиву загруженных дополнений. Они сами встали на свои места, как мы того ждем. В документации кажется приводятся примеры, когда можно не объявлять тип контракта, но тогда MEF не узнает, что чему сопоставлять. Выходом может стать тип dynamic.

 

Подробнее

MEF

Сегодня я хочу рассказать о системе постороения динамического, модульного приложения с использованием Managed Extensibility Framework (MEF).  Вообще это уже достаточно старая технология, которая вылилась из системы Add-On от компании Микрософт. МEF стала дружелюбной оболочкой над монструозной системой предложенной ранее. Результат оказался настолько хорош, что MEF включили в поставку .Net Framework 4 по умолчанию, так что не потребуется искать и загружать библиотеки отдельно, беспокоится, есть ли данная библиотека у пользователя.

Так же уже понятно, что данную технологию можно использовать в Enterprise разработке, так как она в основной поставке фреймворка, а это такой аргумент, против которого менеджеры проектов не попрут. Обычно, менеджеры проектов очень неохотно идут на использование технологий и продуктов которые не упомянуты в пресс-релизах MS, даже если данная технология широко и успешно используется сообществом. Хотя их можно понять, это будет первый пункт, по которому их будут пинать в случае любых накладок.

Итак, MEF легко позволяет сделать приложение модульным, и подключение новых библиотек может быть осуществленно на лету, без использования сложных приемов. Весь код остается прозрачным и легким для понимания.

 

MEF можно использовать начиная с версии .Net 3.5, взяв необходимые библиотеки с CodePlex. Как вы уже догадались, оттуда же можно взять исходный код и посмотреть как все это работает.

Основные возможности MEF:

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

Подробнее