3

ビジネス ロジックが実行時に読み込まれる dll に配置されるように、バックエンドを設計しました。ShadowCopyFiles = true とファイル システム モニタリングを使用すると、ホスト プロセスを再起動せずにビジネス ロジックを変更できます。

ここまでは順調ですね...

ホスト appdomain A と子の 1 つ B を呼び出しましょう。

残念ながら、B によって参照されているが A によって参照されていないアセンブリ C に変更を加えた場合、これらの変更は B が再ロードされたときに反映されません。AがC自体をロードするためだと思います。A が C を読み込まないようにするには、どのような手順を踏む必要がありますか?

これは、A が B をロードするために使用するコードです。

        AppDomainSetup appDomainSetup = new AppDomainSetup();
        appDomainSetup.CachePath = ServiceDLLPath + @"\Shadow";
        appDomainSetup.ShadowCopyFiles = "true";

        ad = AppDomain.CreateDomain(assemblyName, null, appDomainSetup);
        ad.InitializeLifetimeService();
        try
        {
            service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName, 
                                  "AppName.Services." + typeName);
            service.Start();
        }
        catch (Exception e)
        {
            LogManager.Log("AppDomain load failed: " + e.Message);
            return false;
        }
4

3 に答える 3

0

「インターフェイス」アセンブリを作成して解決しました。

したがって、このアセンブリが X と呼ばれる場合、チェーンは次のようになります。

A -> X <- B -> C

(元々: A -> B -> C)

これで、B または C のいずれかで変更を加えることができます。変更は、appDomain B が破棄され、A によって再起動されたときに反映されます。

編集、ティムの要求に応じて、さらに詳細。

appdomain A のコードは変更されていません。私の質問を見ることができます。注意が必要なのは、IService 型定義の場所だけです。

 service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName, 
                              "AppName.Services." + typeName);

IService が専用のアセンブリに移動されると、B と A の両方の参照を削除することができました。これは、何らかの方法で A を C に接続することになりました。基本的に、Chris が言ったことはすべて正しいですが、パスが何であるかが常に明確であるとは限りません。 .

于 2012-05-22T10:42:44.797 に答える
0

A参照Cし、「ホスト」である場合、プロセスを停止して再起動し ないとAリロードできません。C

1 つの可能性は、AppDomain をブートストラップするA(そして再起動できる) 非常に薄い shim AppDomain を作成することですが、プロセスを再設定すると、おそらく同じパフォーマンス プロファイルになります。

もう1つの(一見まともな)アプローチはA、によって使用されるものとは独立した依存関係を作成Cし、重複するアセンブリについては、それらを頻繁に変更する必要がないほど十分に安定させることです。

于 2012-05-21T18:25:32.820 に答える
0

回答とコメントを読むと、ビジネス ロジックを WCF サービスにラップしたほうがよいように思えます。ネット パイプを使用して、同じ PC で実行するためのオーバーヘッドを最小限に抑えることができます。また、アプリケーションの拡張性を構築するために MEF も検討する必要があります。残念ながら、MEF は、ホスト アプリケーションを再起動せずにオンザフライでプラグインをアンロードして置換できるようにも設計されていません。

于 2012-05-22T11:01:07.957 に答える