C#将不同版本的程序集加载到同一项目中

我正在创建一些执行NUnit等多个操作的工具。 在这个工具里面,我打开.dll程序集并调用方法形成它来运行一些测试。

一切都好,直到我需要重新加载.dll,程序重启。 我们的想法是,当工具运行时,我们将所需的程序集复制到一些临时文件夹并从那里调用。 如果我需要重新加载,我将另一个复制到另一个临时文件夹,并尝试从另一个文件夹加载新复制并加载到以前的程序集对象

ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 

但我的问题是,在我将AssemblyFullPath更改为新的并调用Assembly.LoadFrom之后,它只返回旧程序集第一次加载的内容而不是第二次加载的内容! 也许问题是我们无法加载不同版本的几个程序集? 解决办法是什么?

CLR支持将多个版本的强命名程序集加载到同一AppDomain 。 仅当您的程序集具有强名称且每个程序集的版本与另一个版本不同时,这才有效。

我猜你更有可能处理未签名的程序集。 如果是这种情况那么你要求的是不可能的。 将给定程序集加载到AppDomain ,它将保留在那里,直到卸载AppDomain 。 要使其工作,您必须将加载的程序集的所有工作抽象到单独的AppDomain并为每个程序集使用新的AppDomain

要扩展JaredPar的答案,您需要创建一个新的AppDomain并使用Remoting在两者之间进行通信。

查看http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=vs.85).aspx以帮助您入门。

试试这样:

 string dllFile = "C:\\sample.dll"; Assembly asmLoader = Assembly.LoadFile(dllFile); Type[] types = asmLoader.GetTypes(); 

由于程序集中的所有资源在应用程序仍在运行时无法重新加载/替换它的程序集资源。 只有在卸载应用程序或持有应用程序的程序集时才会替换/删除它。

使用LoadFile()方法。 希望能帮助到你。