要件:ビジネスロジックは複雑でカスタマイズが必要であり、そのようなロジックは別のDLLアセンブリ上でバックグラウンドが動的にアセンブリを更新し、最新のロジックを実行できます。
.NET Coreは.NET FrameworkのようなAppDomainの動的な作成・アンロードをサポートしていないため、プラグインをホットロードする良い方法がこれまで存在しませんでしたが、良いニュースは.NET Coreが3.0以降Collectible Assemblyをサポートしており、アセンブリの読み込み・アンロードに使える再利用可能なAssemblyLoadContextを作成できることです。
AssemblyLoadContextクラス:ハイパーリンクのログインが見えます。
まず、新しいコンソールと3つのライブラリを作成します。すなわち:コンソールアプリ6、クラスライブラリスタンダード、クラスライブラリ1、クラスライブラリ2そのうち、ClassLibrary1およびClassLibrary2ライブラリはClassLibraryStandardのIWorkerインターフェースを継承し、Runメソッドを実装しています。
ClassLibraryStandard コード:
ClassLibrary1 コード:
ClassLibrary2 コード:
ConsoleApp6のコンソールコードは以下の通りです:
コンソールはDLLプラグインで3スレッドのRunメソッドを開き、常に動的に実行され、log4netを使って出力結果を記録し、コンソール上で実行します3秒後にDLLを最新のライブラリに置き換えます。
コンソールを1秒または5秒実行した後、現在のAssemblyLoadContextインスタンスのコレクションが出力され、これがロードされたDLLライブラリとなります。
以下に示すように:
プログラムに異常な出力はなく、実行中にプラグインが見つからない状況もありません。 log4netが実行結果を記録する理由は、コンソールがブロックされているためであり、3つのスレッドが連続的に実行できるようにするために、log4netが実行結果を記録しているからです。以下の図に示されています。
2024-06-28 14:24:36,606 情報 11 RollingFile - 1 2024-06-28 14:24:36,606 情報 10 RollingFile - アンインストール開始 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 11 RollingFile - 1 2024-06-28 14:24:36,606 情報 11 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 10 RollingFile - AssemblyLoadContext_Unloading 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 2024-06-28 14:24:36,606 情報 13 RollingFile - 1 ... 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,607 情報 13 RollingFile - 1 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,606 情報 10 RollingFile - アンインストール完了 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 ... 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,607 情報 13 RollingFile - 1 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,607 情報 13 RollingFile - 1 2024-06-28 14:24:36,607 情報 12 RollingFile - 1 2024-06-28 14:24:36,606 情報 11 RollingFile - 1 2024-06-28 14:24:36,607 情報 13 RollingFile - 2 2024-06-28 14:24:36,607 情報 12 RollingFile - 2 添付config.xml構成:
(終わり)
|