Issue
MEFコードは、実行時にDirectoryCatalogに関連付けられたフォルダからアセンブリを適切に更新していません。プラグインは実行時に十分に読み込まれますが、dllを更新してDirectoryCatalogでRefreshを呼び出すと、アセンブリが更新されません。背景
私はMEFコンテナを持つdllを構築しており、ローカルのプラグインフォルダを見つけるためにDirectoryCatalogを使用しています。私はこのDLLを現在シンプルなWinFormから呼び出しています。これは、ShadowCopyを使用するための別個のプロジェクトをセットアップしているので、プラグインフォルダ内のDLLを上書きすることができます。 FileWatcherを使用してこのフォルダを更新する代わりに、DirectoryCatalogの更新を呼び出すパブリックメソッドを公開しています。したがって、自動的にではなくアセンブリを更新できます。コード
基底クラスは、MEFカタログやコンテナをインスタンス化し、参照のアクセスのためのクラス変数として保存し、後で
public class FieldProcessor
{
private CompositionContainer _container;
private DirectoryCatalog dirCatalog;
public FieldProcessor()
{
var catalog = new AggregateCatalog();
//Adds all the parts found in the same assembly as the TestPlugin class
catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestPlugin).Assembly));
dirCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "Plugin\\");
catalog.Catalogs.Add(dirCatalog);
//Create the CompositionContainer with the parts in the catalog
_container = new CompositionContainer(catalog);
}
public void refreshCatalog()
{
dirCatalog.Refresh();
}
} ...
ここで私が上書きしようとしているプラグインです。私の更新のテストは、返された刺し傷がテキストボックスに出力され、プラグインが戻ってきた文字列を変更して再構築し、それをプラグインフォルダにコピーします。しかし、それは私がアプリケーションを閉じて再起動するまで、実行中のアプリケーションのために更新されません。
[Export(typeof(IPlugin))]
[ExportMetadata("PluginName", "TestPlugin2")]
public class TestPlugin2 : IPlugin
{
public IEnumerable<IField> GetFields(ContextObject contextObject, params string[] parameters)
{
List<IField> retList = new List<IField>();
//Do Work Return Wrok Results
retList.Add(new Field("plugin.TestPlugin2", "TestPluginReturnValue2"));
return retList;
}
}
編集
import文[ImportMany(AllowRecomposition=true)]
IEnumerable<Lazy<IPlugin, IPluginData>> plugins;
DirectoryCatalog.Refreshます更新されたassebmliesを検出しません。新規または削除されたもののみ。回避策と提案のためのこの答えを見てください:http://stackoverflow.com/a/14842417/850119 –
私のdllはロードされるとロックされますので、新しいdllでそれらを無効にできません。この問題はありませんでしたか?あなたはそれらを更新可能にした何かをしましたか? –
ええ、私はこの問題を抱えていました。私が渡した段階の1つは、「シャドウコピー」を有効にすることでした。シャドウコピーを使用すると、プログラムはDLLをロックする代わりに、ローカルアセンブリのローカルコピーを作成してローカルキャッシュに追加することができます。これは、実行時にdllを "ホットスワップ"できるようにするために有効にする必要があります。そうしないと、プログラムを停止し、dllを変更して再起動する必要があります。私はこれが私が見ている例だと思うが、それはあなたのGoogle MEFとシャドーコピーのために動作しない場合、http://stackoverflow.com/questions/12593308/mef-and-shadowcopying-dlls-so-that-i -can-overwrite-them-at-runtime – Madullah