从dll文件加载Prism模块(启动时)

时间:2012-04-02 09:03:59

标签: c# .net prism prism-4

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));
        }        
    }

我想通过指示dll文件的路径来加载FooModule和BarModule ,如下所示:

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 个答案:

答案 0 :(得分:2)

好的,试着让你的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 :(得分:1)

我认为Prism v4 Loading modules on demand with DirectoryModuleCatalog可以提供帮助。

<强>更新
对不起,刚才意识到上面提到的参考不会有帮助 试试这个one from msdn - “按需加载模块”部分,我认为这就是你需要的。

答案 2 :(得分:1)

一种不用手动输入路径的简单方法是,从type-&gt; assembly-&gt; 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;