Предотвращение включения DLL в xap?
Я использую MEF в silverlight для динамической загрузки некоторых плагинов из вторичного файла xap. Этот вторичный файл XAP построен из проекта, который ссылается на различные проекты плагинов, все из которых построены на dll, которые уже находятся в первичном файле xap.
Как таковой, я хочу довольно явный контроль над тем, какие dll попадают в этот вторичный xap. Включение любых dll из основного файла xap является излишним (а также вызывает проблемы с перекомпоновкой MEF). Но Visual Studio, похоже, настаивает на включении различных зависимых библиотек, даже когда свойство CopyLocal имеет значение True только для ссылок на проекты плагинов.
Пока единственное, что я обнаружил, что работает, это добавить явные ссылки на пробелматические всегда включенные dll в проекте верхнего уровня, который создает вторичный xap, и установить для CopyLocal значение False в ссылочных свойствах. Но это хрупко, так как зависимости меняются.
Я думаю об этом неправильно? Должен ли я просто создать отдельный xap для каждого dll плагина (в этом случае установка CopyLocal в false для всех ссылок, кажется, работает)?
2 ответа
Помимо настройки кэширования библиотеки приложений в проекте Silverlight, выбрав параметр "Уменьшить размер XAP с помощью кэширования библиотеки приложений" в настройках проекта ( источник), вам необходимо иметь 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-файла.
Посмотрите здесь: http://msdn.microsoft.com/en-us/library/dd833069(VS.95).aspx
В частности, обратите внимание на раздел "Настройка сборки для использования с кэшированием библиотеки приложений". Он описывает метод для выполнения чего-то, что, по крайней мере, довольно близко к тому, что вы ищете.