mef を使用して POC を作成しようとしています。この場合、すべての準備が整った実行中のプロジェクトで dll を動的にロードする必要があります。このため、1 つのコンソール アプリケーション プロジェクトとクラス ライブラリを作成しました。
事業 。
コンソール アプリケーション プロジェクトのコードは次のとおりです。
namespace MefProjectExtension
{
class Program
{
DirectoryCatalog catalog = new DirectoryCatalog(@"D:\MefDll", "*.dll");
[Import("Method1", AllowDefault = true, AllowRecomposition = true)]
public Func<string> method1;
static void Main(string[] args)
{
AppDomainSetup asp = new AppDomainSetup();
asp.ShadowCopyFiles = "true";
AppDomain sp = AppDomain.CreateDomain("sp",null,asp);
string exeassembly = Assembly.GetEntryAssembly().ToString();
BaseClass p = (BaseClass)sp.CreateInstanceAndUnwrap(exeassembly, "MefProjectExtension.BaseClass");
p.run();
}
}
public class BaseClass : MarshalByRefObject
{
[Import("Method1",AllowDefault=true,AllowRecomposition=true)]
public Func<string> method1;
DirectoryCatalog catalog = new DirectoryCatalog(@"D:\MefDll", "*.dll");
public void run()
{
FileSystemWatcher sw = new FileSystemWatcher(@"D:\MefDll", "*.dll");
sw.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.Size;
sw.Changed += onchanged;
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
Console.WriteLine(this.method1());
sw.EnableRaisingEvents = true;
Console.Read();
}
void onchanged(object sender, FileSystemEventArgs e)
{
catalog.Refresh();
Console.WriteLine(this.method1());
}
}
}
インポートを満たすライブラリ プロジェクトは次のようになります。
namespace MefLibrary
{
public interface IMethods
{
string Method1();
}
public class CallMethods : IMethods
{
[Export("Method1")]
public string Method1()
{
return "Third6Hello";
}
}
}
ライブラリ プロジェクト (MefLibrary) をコンパイルし、DLL を D:\MefDll の場所に置き、コンソール アプリケーションを初めて実行すると、次のような出力が表示されます。
画面上のThird6hello
しかし今、method1 の実装を変更して "third7hello" を返すようにすると、MEF ライブラリ プロジェクトをビルドし、D:\MefDll で置き換えます。これは、コンソール アプリが onchanged ハンドラーを実行しているときに、カタログの更新を呼び出した後 でも、画面にthird7hello ではなくThird6helloが出力されます。
誰かがこれの理由を知っているかどうか、もしそうなら助けてください。