与MEF的ClickOnce问题

时间:2011-05-20 09:14:00

标签: c# clickonce mef

我有一个相当复杂的wpf应用程序,它使用MEF加载可选组件。这对标准安装程序来说效果很好。

我正在尝试使用ClickOnce部署来实现这一点,当应用程序假定要导入可能的MEF组件时,我得到一个例外:

System.ComponentModel.Composition.CompositionException:合成产生了单个合成错误。根本原因如下。查看CompositionException.Errors属性以获取更多详细信息。

1)远程服务器返回错误:(404)Not Found。

导致:尝试创建“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”)'。 元素:Client.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 usercontrol,它从URL加载图像。当我删除该网址时,它的工作原理。这可能与安全有关吗? Click Once安装程序是完全信任。

1 个答案:

答案 0 :(得分:3)

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

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