3

独自のサブディレクトリでプラグインアセンブリを処理する場合、サブディレクトリからそれぞれの依存関係を読み込もうとすると、これらのアセンブリを読み込めないというよく知られた問題があります。解決策は、初期化時にオブジェクトにPrivateBinPath設定されたプラグインをAppDomainsにロードすることです。AppDomainSetupただし、これにより、特にプラグインがGUIを提供することになっている場合は、マーシャリング/AppDomain間の通信に関して他の問題が発生します。

セキュリティの側面の優先度が低い場合(重要ではないユーティリティアプリケーション、プラグインの障害によるクラッシュ時に深刻な問題は発生しない)、次のような考えがあります。アプリケーションの起動時に、すべてのプラグインディレクトリを検索し、新しいbinパスにこれらのディレクトリを持つAppDomainを作成する必要があります。次に、アプリケーション全体とそのGUIが、すべてのプラグインとともにその新しいAppDomainで実行されます。

与えられた状況下で、その解決策を避ける理由はありますか?それとも、その解決策が実行可能でさえない理由は何かありますか?

4

1 に答える 1

1

説明されたシナリオを考慮して、2番目のドメインの提案に関連する問題については知りません. ただし、アドインのサブディレクトリを自分で検索し、Assembly.LoadFrom.

FindAssemblyByName考えられるすべての場所を検索するために を実装する必要がある、このための可能な設定の例:

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    // ...
}

static Assembly CurrentDomain_AssemblyResolve(
    object sender, 
    ResolveEventArgs e)
{
    var assemblyName = new AssemblyName(e.Name);

    string assemblyFilePath = FindAssemblyByName(assemblyName);

    if (string.IsNullOrEmpty(assemblyFilePath))
        return null;

    return Assembly.LoadFrom(assemblyFilePath);
}
于 2012-08-11T11:23:07.653 に答える