是否有.NET中热插拔的参考实现?

时间:2013-03-05 19:15:25

标签: c# .net mef hotswap

我正在寻找在.NET中完成热交换的良好实现。我需要的是:

  • 能够在特定文件夹中部署DLL并让正在运行的系统接收它们。
  • 让正在运行的系统更新容器中的相应引用。

我一直在研究MEF及其目录加载机制,但似乎非常不可靠。也许有人在那里有另一种实现方式?

1 个答案:

答案 0 :(得分:6)

您可以通过调用下面的AssemblyResolvenewAppDomain()提供自定义事件处理程序。提供您的目录,以便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;
}
相关问题