6

.NET で行われるホットスワップの適切な実装を探しています。必要なものは次のとおりです。

  • 特定のフォルダーに DLL を展開し、実行中のシステムにそれらを取得させることができます。
  • 実行中のシステムに、コンテナー内の対応する参照を更新させる。

MEF とそのディレクトリ ロード メカニズムを調査してきましたが、非常に信頼性がないようです。誰かが別の実装を持っているのではないでしょうか?

4

1 に答える 1

6

AssemblyResolve以下を呼び出して、 のカスタム イベント ハンドラーを提供できnewAppDomain()ます。ディレクトリを指定して、AppDomainそこに見えるようにします。Type をロードするときは、関数を使用loadFromAppDomain()してそれを返します。これにより、実行時に新しい dll をコピーしてC:\dlls、そこからリロードできるようになります。(すみません、あなたのタグに従ってこれをVBソースからC#に翻訳しました。)

String dllFolder = "C:\\dlls";

public void newAppDomain()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(assemblyResolve);
}

private static Assembly assemblyResolve(Object sender, ResolveEventArgs args){
    String assemblyPath = Path.Combine(dllFolder, new AssemblyName(args.Name).Name + ".dll");
    if(!File.Exists(assemblyPath))
    {
        return null;
    }
    else
    {
        return Assembly.LoadFrom(assemblyPath);
    }
}

private Type loadFromAppDomain(String className)
{
    Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
    List<Type> types = new List<Type>();
    foreach(Assembly ass in asses)
    {
        Type t = ass.GetType(className);
        if(t != null) types.Add(t);
    }
    if(types.Count == 1)
        return types.First();
    else
        return null;
}
于 2013-03-05T19:51:10.883 に答える