我在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似乎都有效)?
答案 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
具体来说,请查看标题为“配置与应用程序库缓存一起使用的程序集”的部分。它描述了一种方法,可以做一些至少非常接近你正在寻找的东西。