【问题标题】:ClickOnce issue with MEFMEF 的 ClickOnce 问题
【发布时间】:2011-05-20 09:13:59
【问题描述】:

我有一个相当复杂的 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 用户控件,它从 URL 加载图像。当我删除该网址时,它可以工作。这可能与安全有关吗? Click Once 安装程序完全受信任。

【问题讨论】:

  • 我让 MEF 在单击部署后的应用程序中工作,因此它可以工作......我会尝试的第一件事是直接加载程序集,看看会发生什么。

标签: c# clickonce mef


【解决方案1】:

好的,我终于找到了。我会为任何有兴趣的人留下一个快速的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多