MEF список деталей иногда пуст - PullRequest
2 голосов
/ 03 февраля 2012

В настоящее время я использую MEF и DirectoryCatalog для загрузки некоторых частей из некоторых расширенных DLL.Это работает для меня и большинства людей, которые используют программу, но некоторые пользователи испытывают, что детали вообще не загружаются.Собирая некоторую отладочную информацию, кажется, что MEF действительно загружает библиотеки DLL (их перечисляет каталог catalog.LoadedFiles), но в каталоге нет частей. Детали.

Один пользователь работает на XP sp3, а другой на Windows 7, поэтому я не думаю, что проблема в ОС.Кто-нибудь имеет представление о том, почему это происходит?

Ниже приведен код, который фактически создает контейнер, на случай, если он поможет с чем-либо.

        private static IEnumerable<Task> CreateTypes()
    {
        CompositionContainer container = GetContainer();
        var exp = container.GetExports<Task>();
        return exp.Select(e => e.Value);
    }

    private static CompositionContainer container;
    public static CompositionContainer GetContainer()
    {
        if (container != null)
            return container;

        DirectoryCatalog catalog = new DirectoryCatalog(ExtensionDirectory, "*.dll");
        container = new CompositionContainer(catalog);
        return container;
    }

Ответы [ 2 ]

1 голос
/ 03 ноября 2013

(Да, я отвечаю на свой вопрос ... больше года спустя ...)

http://mikehadlow.blogspot.com/2011/07/mef-directorycatalog-fails-to-load.html

В основном, потому что некоторые люди загружали программу с помощью IEзатем разархивировали с помощью проводника Windows, библиотеки DLL были помечены как выходящие из Интернета, поэтому MEF отказался загружать свои части, хотя они все еще отображались в каталоге.

Решение (по крайней мере для моей ситуации) было простымудалить альтернативные потоки данных, в которых указано, что библиотеки были из Интернета, как описано в приведенной выше ссылке.

0 голосов
/ 06 февраля 2012

но другой находится в "C: \ Spiele", который звучит как созданная пользователем папка

напоминает мне об этом:

Проблемы с загрузкой сборки

В .NET существуют разные контексты, в которые можно загрузить сборку. Контекст загрузки по умолчанию, как правило, лучше всего использовать, но он не может загружать сборки, которые не находятся в каталоге базы приложения, подкаталоги базы приложения, которые включены в путь зондирования, или GAC. При использовании DirectoryCatalog или передаче пути к конструктору AssemblyCatalog MEF попытается загрузить сборки в контексте загрузки по умолчанию. Однако, если сборки не находятся на пути проверки или в GAC, это будет невозможно, и вместо этого MEF загрузит их в контексте загрузки.

Контекст загрузки может привести к проблемам идентификации типов, которые приводят к InvalidCastException, MissingMethodException или другим ошибкам. Чтобы избежать этих проблем в приложении MEF, вы можете поместить любые каталоги расширений в базовый каталог приложения и добавить их в проверочный личный путь в файле конфигурации вашего приложения. Другие параметры и дополнительную информацию о загрузке сборок в .NET см. В документе Рекомендации по загрузке сборок в MSDN.

См. Источник " Как отлаживать и диагностировать сбои MEF " для получения дополнительной информации и средств отладки.

...