Проблема ClickOnce с MEF - PullRequest
       20

Проблема ClickOnce с MEF

2 голосов
/ 20 мая 2011

У меня довольно сложное 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, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = 101)" *

В результате: не удалось получить экспорт 'Client.Map.GeneralXamlMap.GeneralMapViewModel (ContractName = "Client.Core.Core.Map.IMapViewModel") "из части" Client.Map.GeneralXamlMap.GeneralMapViewModel ". Элемент: Client.Map.GeneralXamlMap.GeneralMapViewModel (ContractName = "Client.Core.Core.Map.IMapViewModel") -> Client.Map.GeneralXamlMap.GeneralMapViewModel -> AssemblyCatalog (Assembly = "Client.Map.Mapral =am 1.0.0.0, Культура = нейтральная, 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. Когда я удаляю этот URL, он работает. Может ли это быть связано с безопасностью? Установщик Click Once - это полное доверие.

1 Ответ

3 голосов
/ 22 мая 2011

ОК, так что я наконец нашел его.Я оставлю быстрое решение для всех, кто интересуется.

После недолгого осмотра я обнаружил, что проблема вызвана не реализацией MEF, а компонентом MEF с ошибочной реализацией.Один из компонентов объединяет среду выполнения словаря ресурсов, и этот словарь был загружен с использованием URI «pack: // siteoforigin ...». Когда приложение было развернуто с использованием ClickOnce, исходным сайтом был веб-сервер, и приложение затем отправило httpgetвеб-сервер, чтобы получить файл в URI, что приводит к ошибке 404.

...