0

MEFを介してプラグインをロードするアプリケーションを入手しました。

アプリケーションは、ターミナルサーバー上でいくつかのインスタンスで実行されています。

本番環境で新しいプラグインをテストする必要がある場合は、MEFを別のフォルダーにリダイレクトします。問題は、リダイレクトした後でも、アセンブリが元のフォルダから読み込まれることがあることです。 毎回発生するわけではなく、自分のマシンで再現することはできません。なんらかのキャッシュの問題だと思います。

MEFロードコードは次のようになります。

using (var catalog = new AggregateCatalog()) {

    Console.WriteLine("Loading components from {0}", folder);

    catalog.Catalogs.Add(new DirectoryCatalog(folder, "*.dll"));

    using (var container = new CompositionContainer(catalog)) {
        try {
            container.ComposeParts(this);
        }
        catch (ReflectionTypeLoadException ex) {
            foreach (var loaderException in ex.LoaderExceptions) {
               // log loading error
    }
}

foreach (var assembly in _allComponents.GroupBy(x => x.GetType().Assembly)) {
    Console.WriteLine("Loaded from {0}", assembly.Key.CodeBase);
}

上記のコードの結果は次のようになります

Loading components from C:\NewPlugins
Loaded from C:\OldPlugins
4

1 に答える 1

0

コメントによると、両方のディレクトリに同じIDのアセンブリがあるため、上記のコードからの出力は正常です。これはの問題ではありませんDirectoryCatalog。特定のディレクトリからアセンブリを読み込もうとしますが、同じIDのアセンブリが現在のディレクトリに既に読み込まれている場合、CLRはそれを読み込みませんAppDomain。アセンブリがどこからロードされたかは関係ありません。重要なのはIDだけです。

解決策は、アセンブリに強い名前を付け、プラグインの更新を作成するたびにバージョンをインクリメントすることです。このようにして、NewPluginsディレクトリ内のアセンブリは、OldPluginsディレクトリからすでにロードされているものとは異なるIDを持ちます

アセンブリのロード方法について知りたい場合は、アセンブリのロードに関するSuzanneCookのブログエントリを参照してください。

于 2013-03-11T07:53:18.223 に答える