我在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是否與加載它的程序集的簽名相匹配。
請讓我知道是否需要更清晰。
非常感謝!