定義済みの物理ファイル パスから DLL を動的にロードするプラグイン アーキテクチャを C#.NET で構築しました。アセンブリが 2 つの場所のメモリ ロケーションに存在する可能性があることを認識しているため、次のようなものを使用してアセンブリ内のメンバー (インターフェイス) を検証することは信頼できません...
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 がそれをロードするアセンブリの署名と一致することをテストする良い方法があるかもしれません。
さらに明確にする必要がある場合はお知らせください。
とてもありがたい!