我正在寻找在.NET中完成热交换的良好实现。我需要的是:
我一直在研究MEF及其目录加载机制,但似乎非常不可靠。也许有人在那里有另一种实现方式?
答案 0 :(得分: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;
}