загрузить модули Prism из DLL-файлов (при запуске) - PullRequest
2 голосов
/ 02 апреля 2012

Atm в моем приложении я делаю так:

class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();

            App.Current.MainWindow = (Window)Shell;
            App.Current.MainWindow.Show();
        }     

        protected override void ConfigureModuleCatalog()
        {            
            base.ConfigureModuleCatalog();
            var moduleCatalog = (ModuleCatalog)ModuleCatalog;

            moduleCatalog.AddModule(typeof(FooModule));
            moduleCatalog.AddModule(typeof(BarModule));
        }        
    }

Я бы хотел загрузить FooModule и BarModule, указав путь к файлу dll , что-то вроде этого:

protected override void ConfigureModuleCatalog()
{
...
            var assembly = Assembly.LoadFrom(@"libs\FooLib.dll");
            var type = assembly.GetType("FooLib.FooModule");
            moduleCatalog.AddModule(type);
...
}

но это не работает, я получаю это сообщение об ошибке в Bootstrapper.Run ():

В настоящее время в ModuleManager нет moduleTypeLoader, который мог бы извлечь указанный модуль.

РЕДАКТИРОВАТЬ: это мой FooModule:

public class FooModule : IModule
    {
        private readonly IRegionViewRegistry _regionViewRegistry;

        public FooModule(IRegionViewRegistry registry)
        {
            _regionViewRegistry = registry;
        }

        public void Initialize()
        {
            _regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Main));
        }
    }

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Хорошо, попробуйте сделать ваш ConfigureModuleCatalog похожим на это:

protected override void ConfigureModuleCatalog()
{
    string path = @"libs\FooLib.dll";
    var assembly = Assembly.LoadFrom(path);
    var type = assembly.GetType("FooLib.FooModule");
    ModuleCatalog.AddModule(new ModuleInfo
                                {
                                    ModuleName = type.Name,
                                    ModuleType = type.AssemblyQualifiedName,
                                    Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri
                                });


}

Главное:

Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri    

prism проверяет, относится ли свойство Ref кфизический файл (file://) и загружает сборку из этого файла.

1 голос
/ 19 мая 2015

Еще один простой способ не вводить путь вручную - получить его из type-> Assembly-> location

    Type module1Type = typeof(Module1.Module1);
    string path = module1Type.Assembly.Location;
    moduleCatalog.AddModule(
      new ModuleInfo()
      {
          ModuleName = module1Type.Name,
          ModuleType = module1Type.AssemblyQualifiedName,
          Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri
      });

    return moduleCatalog;
1 голос
/ 02 апреля 2012

Я думаю, Prism v4. Загрузка модулей по требованию с DirectoryModuleCatalog может помочь.

ОБНОВЛЕНИЕ:
Извините, только что понял, что упомянутая выше ссылка не поможет.
Попробуйте это один из MSDN - " ЗагрузкаМодули по требованию", я думаю, это то, что вам нужно.

...