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