実行時にアセンブリを上書きできるように、アプリケーションが MEF プラグイン ディレクトリで DLL をロックするのを止めようとしています (実際には、MEF にオンザフライでアセンブリをリロードさせようとしているわけではないことに注意してください。次のアプリの起動時に問題ありません。コピーを行うためにアプリを停止する必要はありません)
以下のように、ロードされた mef アセンブリ用にシャドウ コピーされたアプリ ドメインを作成することで、これを実行しようとしています。
[Serializable]
public class Composer:IComposer
{
private readonly string _pluginPath;
public Composer(IConfigurePluginDirectory pluginDirectoryConfig)
{
_pluginPath = pluginDirectoryConfig.Path;
var setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true"; // really??? is bool not good enough for you?
var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + "_PluginDomain", AppDomain.CurrentDomain.Evidence, setup);
appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain));
}
private void DoWorkInShadowCopiedDomain()
{
// This work will happen in the shadow copied AppDomain.
var catalog = new AggregateCatalog();
var dc = new DirectoryCatalog(_pluginPath);
catalog.Catalogs.Add(dc);
Container = new CompositionContainer(catalog);
}
public CompositionContainer Container { get; private set; }
}
次に、このクラスの CompositionContainer を介して MEF コンポーネント カタログにアクセスします。ただし、コンポジション コンテナーはシャドウコピー ドメイン内でのみ初期化されるようです (これは理にかなっています)。これは、アプリケーション ドメインでは null であることを意味します。これを行うためのより良い方法があるかどうか、またはクロスドメインクエリを使用して MEF コンポーネントを取得する方法があるかどうか疑問に思っていました