Application.LoadComponent для загрузки компонента из связанной сборки MEF - PullRequest
1 голос
/ 21 апреля 2011

Я пишу приложение WPF, используя MEF для расширяемости.Базовое приложение Импортирует тип из сборки, которую базовое приложение ничего не знает об использовании MEF DirectoryCatalog.Сборка, содержащая импортируемый тип, находится в другом каталоге и имеет встроенный компонент ресурса XAML, к которому я обычно смогу получить доступ, используя

Application.LoadComponent( new Uri( "MyAssembly;component/MyXaml.xaml" ) );

Однако, поскольку сборка связана впри этом получается IOException Cannot locate resource 'myxaml.xaml' (кажется странным, не жалуясь на невозможность найти сборку)

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 21 апреля 2011

Возможно, вы чрезмерно усложняете использование MEF и внешнего импорта. Обычно происходит то, что у вас есть обычные зависимости проекта или внешние зависимости в вашем приложении, и из того, что я могу прочитать в вашем посте, пока это работает нормально для вас.

Ваша проблема возникает, когда вы добавляете MEF в уравнение. Вероятно, это из-за того, как вы загружаете MEF и импортируете эти библиотеки DLL, а я не могу это выяснить, посмотрев на ваш код.

Я могу рассказать вам, как я делаю это с успехом в приложениях, которые я разрабатываю:

Я все настраиваю нормально, с обычными зависимостями проекта, которые мне нужны для каждого проекта, затем, когда я загружаю MEF, из основного проекта приложения WPF, который имеет ссылки почти на все (а в моем конкретном случае это MefBootstrapper Призма) то, что я просто делаю, это:

    public class SigepBootstrapper : MefBootstrapper
    {
        protected override void ConfigureAggregateCatalog()
        {
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(SigepBootstrapper).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(AutoPopulateExportedViewsBehavior).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StatusBarView).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Traversals).Assembly));
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(EngineManager).Assembly));
        }
...

Если бы я не использовал Prism, я бы все равно создал AssemblyCatalog, просто настроил бы их по-другому, поэтому наряду с другим загрузчиком я бы продолжал писать так:

new AssemblyCatalog(typeof(SigepBootstrapper).Assembly)
...