我在 C#.NET 中构建了一个插件架构,可以从预定义的物理文件路径动态加载 DLL。我知道程序集可能存在于两个位置的内存位置中,因此使用类似...的方式验证程序集中的成员(接口)是不可靠的。
if(plugin is T)
// cache the assembly
...所以目前我正在使用接口名称进行比较,然后从中激活一个实例。但是,这也有局限性,因为接口“IPlugin”是许多第三方程序集使用的非常常见的接口名称(例如 log4net 等)
采取以下代码(这是行不通的):
foreach (Type t in assembly.GetTypes())
{
type = t;
if (!type.IsInterface)
{
var plugin = type.GetInterface(typeof(T).Name);
if (plugin != null)
if (plugin is T)
{
T p = (T)Activator.CreateInstance(type);
if (!this.Plugins.Select(sp => sp.Name).Contains(p.Name))
this.Plugins.Add(p);
}
}
}
我的问题:验证动态加载的 DLL 与 IPlugin 接口匹配的最佳(可靠)方法是什么?
一种想法是对 IPlugin 的公钥令牌进行硬编码并对其进行验证,但我想知道是否有更正式的方式。例如,我可以想象一个潜在的安全漏洞,其中程序集欺骗了 IPlugin 名称或公钥令牌......所以也许有一个很好的方法来测试加载的 DLL 是否与加载它的程序集的签名相匹配。
请让我知道是否需要更清楚。
非常感谢!