【问题标题】:Are there reference implementations of hot-swapping in .NET?.NET 中是否有热插拔的参考实现?
【发布时间】:2013-03-05 19:15:25
【问题描述】:

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

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

我一直在研究 MEF 及其目录加载机制,但它似乎非常不可靠。也许有人有替代实现?

【问题讨论】:

  • 为什么你认为MEF不可靠?你还看了什么?像这样的设计问题在Software Engineering 上可能会做得更好,但您需要提供更多详细信息并展示您所考虑的内容。
  • 您希望它有多热插拔?您是否可以在使用旧组件时更换现有组件?
  • 您愿意为该功能支付多少性能?跨越 AppDomain 边界并不便宜(这是 .Net 中隔离具有相同标识的 DLL 的唯一方法)... IIS 模型(在更改二进制文件/配置时重置 AppDomain)是否适合您?
  • 看看 .NET Framework 的 Shadow Copy 与 MEF 的 DirectoryCatalog 和重组功能的结合。快速原型可以基于此 Q&A stackoverflow.com/q/14808762/850119
  • @DmitriNesteruk 希望你在过去三年里解决了这个问题

标签: c# .net mef hotswap


【解决方案1】:

您可以通过调用下面的newAppDomain()AssemblyResolve 提供自定义事件处理程序。提供您的目录,以便AppDomain 在那里查找。加载类型时,使用函数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;
}

【讨论】:

  • +1 以获得彻底的答案。这就是 Microsoft 打算让您进行热插拔的方式。
  • +1。这种方法显然只适用于强类型、正确版本化的程序集。 @evanmcdonnal,旁注 - 请永远不要将汇编缩短为 3 个字母......看起来很有趣,直到你需要让某人阅读你的代码,尤其是那些没有那么高级幽默感的人。
  • @Alexei 我希望我们都有很好的幽默感。我同意强类型的版本化程序集。 OP 没有详细介绍,但该方法在我的环境中运行良好。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 2023-03-15
  • 2020-05-24
  • 2010-11-21
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多