6

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

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

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

4

1 回答 1

6

AssemblyResolve您可以通过以下调用来提供自定义事件处理程序newAppDomain()。提供您的目录,以便AppDomain在那里查看。加载类型时,使用函数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;
}
于 2013-03-05T19:51:10.883 回答