防止dll被包含在xap中?

时间:2011-02-09 21:29:37

标签: silverlight dll mef xap

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

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

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

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

2 个答案:

答案 0 :(得分:1)

通过在项目设置(source)中选择“使用应用程序库缓存减少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文件更改时它不会改变,则只下载一次。

答案 1 :(得分:0)

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

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