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

Dmi*_*ruk 6 .net c# mef hotswap

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

  • 能够在特定文件夹中部署DLL并使用正在运行的系统来获取它们.
  • 让正在运行的系统更新容器中的相应引用.

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

djv*_*djv 6

您可以AssemblyResolve通过调用newAppDomain()以下方式提供自定义事件处理程序.提供你的目录所以AppDomain看那里.加载Type时,使用函数loadFromAppDomain()返回它.这应该允许您C:\dlls在运行时复制新的dll 并从那里重新加载.(原谅我,我根据你的标签将这个从我的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;
}
Run Code Online (Sandbox Code Playgroud)

  • + 1.这种方法显然只适用于强类型,正确版本化的程序集.@evanmcdonnal,旁注 - 请永远不要将汇编缩短为3个字母......看起来很有趣,直到你需要让别人阅读你的代码,特别是那些没有那么先进的幽默感的人. (4认同)