3

Active Directory と通信してユーザー情報を取得するサーバー実行可能ファイルがあります。AD に加えて、この exe を使用すると、顧客は独自のプラグインを記述して、カスタム ユーザー ディレクトリと通信できます。

この実行可能ファイルには厳密な名前が付けられています。

次の記述は正しいですか。

厳密な名前のアセンブリが別のアセンブリを読み込むには、読み込まれたアセンブリも同じキーで署名されている必要があります。

アセンブリが厳密に署名されていない場合、次のコードは null を返します。アセンブリが適切に署名されていないことを示すエラーはありません。アセンブリに署名すると、IService のインスタンスが得られることに注意してください。これにより、読み込まれたアセンブリは強力に署名されている必要があると私は信じています。

Assembly assembly = Assembly.LoadFrom(path);

foreach (Type t in assembly.GetTypes())
{
    if (t.GetInterface(typeof(IService).FullName) != null)
    {
      return (Activator.CreateInstance(t) as IService);
    }
}

つまり、強力に署名されたアセンブリがあり、アセンブリ プラグインをサポートしている場合、それらも署名する必要があるということですか?プラグインの作成者は同じキーで署名する必要があります。それは正しく聞こえません。

最後に、IService インターフェイスを実装するだけでなく、別のアセンブリを参照するアセンブリも参照するアセンブリがあり、それぞれが異なるキーで署名されているとします。ロードしようとするとどうなりますか? それらはすべて同じ鍵で署名する必要がありますか?

4

3 に答える 3

9

次のステートメントは正しいです。

厳密な名前のアセンブリが別のアセンブリを読み込むには、読み込まれたアセンブリも同じキーで署名されている必要があります。

MSDNから:

次に、厳密な名前のアセンブリが単純な名前のアセンブリを参照すると、これらの利点がなくなり、厳密な名前のアセンブリを使用することから得られる利点が失われ、DLL の競合が発生します。したがって、厳密な名前のアセンブリは、他の厳密な名前のアセンブリのみを参照できます。


編集:おお!私の答えは正しいですが、P Daddy が指摘するように、それは無関係です!

リフレクションを使用して弱い名前のアセンブリを読み込むことは、アセンブリを参照することと同じではなく、同じ方法で制限されることもありません。

次のアセンブリを使用して、コード (または少なくとも近似値) を再作成しました。

  • Interface.dll(署名、含むIService)

  • Loader.exe(を受け取るコンソール アプリであるsignedは、コードを使用して、それによって指定されたアセンブリ内で最初に見つかったものpathを読み込んで返し、次にメソッドを呼び出します)IServicepathIService

  • Plugin.dll(署名なしIService実装を含む)

次に、Plugin.dll参照を追加しLoaded.exeてその実装にアクセスしようとしましIServiceたが、期待どおりに失敗し、次のメッセージが表示されました。

最後に、コンソール アプリを実行し、弱い名前の の名前を渡したところ、問題なく動作Plugin.dllしました。

進行中の何か他のものがあるようです。Scott Hanselman は、動的アセンブリの読み込みの気まぐれについて何度かブログを書いており、このトピックに関する信頼できる詳細については、Suzanne Cook のブログを参照しています

于 2009-09-02T17:42:51.073 に答える
2

あなたのアセンブリが強い場合入力した署名されている場合、ロードするアセンブリも強くなければならないと思います入力した署名されていますが、必ずしも同じ鍵で署名されているとは限りません。

于 2009-09-02T17:41:26.910 に答える
2

ステートメントが間違っています - 参照されるアセンブリは署名されている必要がありますが、必ずしも同じキーで署名されている必要はありません。

厳密な名前のアセンブリを参照すると、バージョン管理や名前保護などの特定の利点が期待できます。次に、厳密な名前のアセンブリが単純な名前のアセンブリを参照すると、これらの利点がなくなり、厳密な名前のアセンブリを使用することから得られる利点が失われ、DLL の競合が発生します。したがって、厳密な名前のアセンブリは、他の厳密な名前のアセンブリのみを参照できます。

( MSDN ライブラリから取得)

于 2009-09-02T17:42:28.813 に答える