2012-01-16 38 views
6

我有使用Prism 4,在我的引导程序我有以下代码WPF Desktop应用程序:如何限制棱镜4只加载特殊签名的模块?

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

上面的代码告诉棱镜从加载了所有.dll“[我的应用程序根] \模块”路径并检查它们以查看是否有任何类实现了IModule。我想要做的是将加载过程限制为仅使用特定符号密钥签名的DLL,以防止任何开发人员将其模块注入到我的应用程序中。如果我在这个问题上走错了路,请提出建议。

回答

2

你走在正确的道路上,但是,你需要走得更远。如您所见,DirectoryModuleCatalog旨在加载指定目录中实现IModule接口的任何类型。如果要限制进一步加载的模块(例如,使用特定键签名的程序集),则需要创建自定义模块目录(可能源自DirectoryModuleCatalog),并重写Initialize方法。 Initialize是模块目录将检查目录并加载包含目录中任何模块信息的ModuleInfo对象的集合。通过重写此方法,您可以检查目录中的程序集,并只从装配中加载具有正确签名的模块。在Initialize方法中,您将使用包含在有效程序集中的模块的ModuleInfos来填充Modules属性。

然后,在上面的代码中,不是创建一个新的DirectoryModuleCatalog(),而是创建自定义模块目录。

请注意,取决于您如何检查程序集的签名,您可能正在将程序集加载到内存中(即使您没有在目录中提供任何模块)。如果是这种情况,您可能需要在单独的AppDomain中验证程序集,然后才能卸载程序集(因此将未签名的程序集从内存中卸载)。

+1

这对Brian有帮助,谢谢Brian。 – 2012-06-20 17:09:41