Iveは、定義済みの物理ファイルパスからDLLを動的にロードするプラグインアーキテクチャをC#.NETに構築しました。私は現在、私はインターフェイスを使用しています... ...プラグインアーキテクチャのアセンブリを動的にロード
if(plugin is T)
// cache the assembly
おそらくこれのようなものを使用してアセンブリ内のメンバー(インターフェース)を確認することが信頼できなくなって2つの場所でメモリ位置に既存のアセンブリの承知しています比較する名前、それからインスタンスをアクティブにします。インタフェースの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がロードされているアセンブリのシグネチャと一致するかどうかをテストする良い方法があります。
もっと明快さが必要な場合は教えてください。
非常に感謝します!