2

我在 silverlight 中使用 MEF 从辅助 xap 文件中动态加载一些插件。这个辅助 XAP 文件是从一个引用各种插件项目的项目构建的,所有这些都是针对已经在主 xap 文件中的 dll 构建的。

因此,我想要非常明确地控制哪些 dll 最终出现在这个辅助 xap 中。包含主 xap 文件中的任何 dll 都是多余的(并且还会导致 MEF 重组出现问题)。但 Visual Studio 似乎坚持包含各种依赖 dll,即使 CopyLocal 属性仅设置为 True 以引用插件项目。

到目前为止,我发现唯一可行的方法是在构建辅助 xap 的顶级项目中添加对探测始终包含的 dll 的显式引用,并在引用属性中将 CopyLocal 设置为 False。但是随着依赖关系的变化,这很脆弱。

我想错了吗?我是否应该为每个插件 dll 构建一个单独的 xap(在这种情况下,将所有引用的 CopyLocal 设置为 false 似乎可行)?

4

2 回答 2

1

除了通过在项目设置(源代码)中选择“使用应用程序库缓存来减少 XAP 大小”选项来在 Silverlight 项目上设置应用程序库缓存外,您还需要在与共享 dll 相同的位置有一个文件。extmap.xml

因此,如果您的 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 文件更改时它不会更改,则只下载一次。

于 2011-02-10T14:22:25.960 回答
0

看看这里: http: //msdn.microsoft.com/en-us/library/dd833069 (VS.95).aspx

具体来说,请查看标题为“配置程序集以与应用程序库缓存一起使用”的部分。它描述了一种至少与您正在寻找的东西非常接近的方法。

于 2011-02-10T14:17:09.597 回答