我有一个使用Prism 4的WPF桌面应用程序,在我的bootstrapper中我有以下代码:
protected override IModuleCatalog CreateModuleCatalog()
{
var filepath = Assembly.GetExecutingAssembly().Location;
var path = Path.GetDirectoryName(filepath);
System.IO.Directory.SetCurrentDirectory(path);
path = Path.Combine(path, "Modules");
var moduleCatalog = new DirectoryModuleCatalog() { ModulePath = path };
return moduleCatalog;
}
上面的代码告诉prism从“[my app root] \ Modules”路径加载所有.dll并检查它们是否有任何类已经实现了IModule。我想要做的是将加载过程限制为仅使用特定符号键签名的DLL,以防止任何开发人员在我的应用程序中注入它的模块。如果我在这个问题上走错路,请告知。
答案 0 :(得分:2)
你走在正确的道路上,但是,你需要更进一步。 DirectoryModuleCatalog旨在加载实现IModule接口的指定目录中的任何类型,如您所见。如果要限制进一步加载的模块(例如,使用特定键签名的程序集),则需要创建自定义模块目录(可能源自DirectoryModuleCatalog),并覆盖Initialize方法。 Initialize是模块目录将检查目录并加载ModuleInfo对象集合的位置,这些对象包含有关目录中任何模块的信息。通过重写此方法,您可以检查目录中的程序集,并仅从具有正确签名的程序集中加载模块。在Initialize方法中,您将使用有效程序集中包含的ModuleInfos模块填充Modules属性。
然后,在上面的代码中,您将创建自定义模块目录,而不是创建新的DirectoryModuleCatalog()。
请注意,根据您检查组件签名的方式,您可能正在将组件加载到内存中(即使您没有在目录中提供任何模块)。如果是这种情况,您可能希望在单独的AppDomain中验证程序集,然后可以卸载它(因此从内存中卸载未签名的程序集)。
答案 1 :(得分:0)
我创建了this custom DirectoryModuleCatalog,您可以在其中指定包含/排除集。