Предотвращение включения dll в xap?

Я использую MEF в silverlight для динамической загрузки некоторых плагинов из вторичного файла xap. Этот вторичный файл XAP создается на основе проекта, который ссылается на различные проекты плагинов, все из которых созданы на основе библиотек DLL, которые уже находятся в первичном файле XAP.

Таким образом, я хочу довольно явный контроль над тем, какие библиотеки DLL попадают во вторичный xap. Включение любых dll из основного файла xap является избыточным (а также вызывает проблемы с перекомпоновкой MEF). Но Visual Studio, похоже, настаивает на включении различных зависимых dll, даже если для свойства CopyLocal установлено значение True только для ссылок на проекты плагинов.

Пока что единственное, что я обнаружил, что работает, - это добавить явные ссылки на всегда включаемые библиотеки DLL в проект верхнего уровня, который строит вторичный xap, и установить для CopyLocal значение False в свойствах ссылки. Но это хрупко, поскольку зависимости меняются.

Я неправильно об этом думаю? Должен ли я просто создавать отдельный xap для каждой dll плагина (в этом случае установка CopyLocal на false для всех ссылок, похоже, работает)?


person aggieNick02    schedule 09.02.2011    source источник


Ответы (2)


Помимо настройки Кэширования библиотеки приложений в проекте Silverlight, выбрав параметр «Уменьшить размер XAP с помощью кэширования библиотеки приложений» в настройках проекта (source) вам нужен extmap.xml файл в том же месте, что и ваша общая dll.

Итак, если ваша dll была Microsoft.Expression.Effects.dll, вам нужно было бы создать (или скопировать) Microsoft.Expression.Effects.extmap.xml.

Выглядит это так:

<?xml version="1.0"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <assembly>
    <name>Microsoft.Expression.Effects</name>
    <version>2.0.20525.0</version>
    <publickeytoken>31bf3856ad364e35</publickeytoken>
    <relpath>Microsoft.Expression.Effects.dll</relpath>
    <extension downloadUri="Microsoft.Expression.Effects.zip" />
  </assembly>
</manifest>

Номер версии должен совпадать с номером версии dll.

Если у вас нет токена открытого ключа, вы можете заменить его на null.

Это скопирует dll в отдельный zip-файл, который затем может использоваться несколькими файлами xap или загружаться только один раз, если он не изменится при изменении файла xap.

person ChrisF    schedule 10.02.2011

Взгляните сюда: http://msdn.microsoft.com/en-us/library/dd833069(VS.95).aspx

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

person Ken Smith    schedule 10.02.2011