【问题标题】:load Prism modules from dll files (at startup)从 dll 文件加载 Prism 模块(在启动时)
【发布时间】:2012-04-02 09:03:58
【问题描述】:

我的应用程序中的 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));
        }
    }

【问题讨论】:

    标签: c# .net prism prism-4


    【解决方案1】:

    好的,试着让你的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://)并从该文件加载程序集。

    【讨论】:

      【解决方案2】:

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

      更新:
      抱歉,刚刚意识到上面提到的参考没有帮助。
      试试这个one from msdn - “Loading Modules on Demand”部分,我认为这就是你所需要的。

      【讨论】:

      • 不,这无济于事,这样他们根本就不会被加载,或者我猜是不需要的
      • 您是否检查过您的FooModuleBarModule 是否可以通过反射加载和实例化?只需创建一些最小的测试控制台应用程序并尝试检查它。
      • 你可以检查this thread on codeplex,也许它会有所帮助
      • 当我尝试执行 Activator.CreateInstance(type) 我得到“没有为此对象定义无参数构造函数”
      • 这就是问题所在。所以添加参数构造函数FooModuleBarModule。如果有任何目标或问题,请告诉我们。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多