如何限制棱镜4只加载特殊签名模块?

Ehs*_*adi 6 c# wpf prism prism-4

我有一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码告诉prism从"[my app root]\Modules"路径加载所有.dll并检查它们是否有任何类已经实现了IModule.我想要做的是将加载过程限制为仅使用特定符号键签名的DLL,以防止任何开发人员在我的应用程序中注入它的模块.如果我正在遵循这个问题的错误路径,请提供建议.

Bri*_*n S 3

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

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

请注意,根据您检查程序集签名的方式,您可能会将程序集加载到内存中(即使您没有在目录中提供任何模块)。如果是这种情况,您可能需要验证单独的 AppDomain 中的程序集,然后可以卸载该程序集(从而从内存中卸载未签名的程序集)。