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

时间:2013-12-19 16:08:21

标签: c# .net reflection version .net-assembly

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

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

  ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 

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

3 个答案:

答案 0 :(得分:9)

CLR支持将多个版本的强名称程序集加载到同一AppDomain中。这仅适用于您的程序集具有强名称且每个程序集的版本与另一个不同的版本。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

试试这样:

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

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

使用LoadFile()方法。希望它有所帮助。