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

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

我正在创建一些工具来执行多个操作,例如 NUnit。 在这个工具中,我打开 .dll 程序集并调用方法来运行一些测试。

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

  ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 

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

最佳答案

CLR 确实支持将强命名程序集的多个版本加载到同一个 AppDomain 中。这仅在您的程序集被强命名并且每个程序集都具有不同版本的情况下才有效。

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

关于C# 将不同版本的程序集加载到同一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20686362/

相关文章:

.net - C# WPF 项目无法调用 F# 库

java - 反射访问Java类中的静态变量

c# - 如何将用户设计的窗体编译添加到工程中

c# - 替代 ObservableCollection?

c# - Ninject NamedScope 条件绑定(bind)

.net - 在 WPF 中更改当前文化后,即时强制更新 UI

.net - 如何检查汇编是否是用VB编写的

C# 通过 Delegate.CreateDelegate 使用具有值类型的属性

c# - ItemTemplateSelector 不适用于没有绑定(bind)的 ListView

c# - 如何将 asp.net 转发器控件动态绑定(bind)到数据源