2011-05-20 64 views
2

我有一个相当复杂的WPF应用程序,使用MEF加载可选组件。这对标准安装程序来说很好。ClickOnce问题与MEF

我试图使用ClickOnce部署和得到这个工作,当应用程序是假设进口可能MEF组件,我得到一个异常:

System.ComponentModel.Composition.CompositionException:该组合物生产的单一组合物错误。根源在下面提供。查看CompositionException.Errors属性以获取更多详细信息。

1)远程服务器返回错误:(404)未找到。

产生:尝试创建类型为“Client.Map.GeneralXamlMap.GeneralMapViewModel”的实例时发生异常。

产生:无法激活零件'Client.Map.GeneralXamlMap.GeneralMapViewModel'。 元素:Client.Map.GeneralXamlMap.GeneralMapViewModel - > Client.Map.GeneralXamlMap.GeneralMapViewModel - > AssemblyCatalog(Assembly =“Client.Map.GeneralXamlMap,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”)

导致:无法从部件'Client.Map.GeneralXamlMap.GeneralMapViewModel'中导出'Client.Map.GeneralXamlMap.GeneralMapViewModel(ContractName =“Client.Core.Core.Map.IMapViewModel”)'“。客户端.Map.GeneralXamlMap.GeneralMapViewModel(ContractName =“Client.Core.Core.Map.IMapViewModel”) - > Client.Map.GeneralXamlMap.GeneralMapViewModel - > AssemblyCatalog(Assembly =“Client.Map.GeneralXamlMap,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null“)

我已经检查了本地文件夹,并且导出的dll与预期的一样在文件夹中。用于查找输出的代码是:

public static IMapViewModel FindMap(string exportMetadataMapName) 
    {    
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog("Client.Map.GeneralXamlMap.dll")); 
     CompositionContainer container = new CompositionContainer(catalog); 
     MapFactory f = new MapFactory(); 
     container.ComposeParts(f); 

     foreach (Lazy<IMapViewModel, IMapMetaData> item in f.maps) 
     { 
      if (item.Metadata.Name.Equals(exportMetadataMapName)) 
      { 
       return item.Value; 
      } 
     } 

     return null;   
    } 

任何想法?

更新:我不知道为什么我以前没有看到这个,但我试图加载的组件是一个wpf用户控件,它从URL加载图像。当我删除它的网址它的作品。这可能是安全相关的吗? Click Once安装程序是完全信任的。

+0

我有MEF工作在点击一次部署的应用程序,所以它可以工作...我会尝试的第一件事是直接加载程序集,看看会发生什么。 – Yaur 2011-05-20 10:09:46

回答

3

好吧,所以我终于找到了。我会为任何感兴趣的人留下快速解决方案。

经过一番周密的挖掘,我发现它不是导致问题的MEF实现,而是具有错误实现的MEF组件。其中一个组件合并资源字典运行时,并且使用URI“pack:// siteoforigin ...”加载该字典。使用ClickOnce部署应用程序时,原始站点是Web服务器,然后应用程序向webserver来获取uri中的文件,导致404错误。