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

8

我正在创建一些类似于 NUnit 的工具,执行多个操作。在这个工具内部,我会打开 .dll 程序集并调用其中的方法来运行一些测试。

一切都很顺利,直到我需要重新加载 .dll 而不重启程序。我的想法是,在工具运行时,我们将所需的程序集复制到某个临时文件夹,并从那里调用。如果需要重新加载,我会将另一个程序集复制到另一个临时文件夹,尝试从另一个文件夹加载新复制的程序集,并将其加载到之前的程序集对象中。

  ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 

但我的问题是,当我将AssemblyFullPath更改为新的路径并调用Assembly.LoadFrom时,它返回的仍然是第一次加载的旧程序集,而不是第二个新的程序集! 也许问题在于我们不能同时加载具有不同版本的多个程序集? 解决方案是什么?


https://dev59.com/yG025IYBdhLWcg3wChKb - Senad Meškin
Assembly.LoadFrom 不会尝试加载相同的程序集两次。 Assembly.LoadFile 有些不同,可能会以某种方式工作,但即使它能够工作,也要准备好遇到许多奇怪的问题。通常最好将此类操作放在单独的 AppDomain 中,并根据需要重新加载它。 - Luaan
3个回答

9
CLR支持将多个版本的强名称程序集加载到同一个AppDomain中。但是,这仅适用于您的程序集都具有不同版本并且都是强名称的情况。
我猜你更可能处理未签名的程序集。如果是这种情况,那么你所要求的实际上是不可能的。一旦给定的程序集被加载到AppDomain中,它将一直保留在那里,直到AppDomain卸载。为了使其工作,您需要将所有与已加载程序集相关的工作抽象出来放在单独的AppDomain中,并为每个程序集使用新的AppDomain。

1

0

可以试试这样:

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

由于应用程序在运行时无法重新加载/替换其程序集资源,因此所有来自程序集的资源都不能被重新加载/替换。只有在卸载应用程序或包含它的程序集时才会被替换/移除。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接