一尘不染

卸载用Assembly.LoadFrom()加载的Assembly

c#

加载dll后,我需要检查运行GetTypes()的时间。代码如下。

Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;

我想卸载并重新加载dll,以检查再次运行GetTypes()所花费的时间。

  • 如何卸载?assem = null够好吗?
  • 有没有一种明确的方法可以调用垃圾回收器来回收分配给Assem的资源?

阅读 537

收藏
2020-05-19

共1个答案

一尘不染

不幸的是,一旦装配被加载,您将无法卸载装配。但是您可以卸载AppDomain。您可以做的是创建一个新的AppDomain(AppDomain.CreateDomain(…)),将程序集加载到此appdomain中以进行处理,然后在需要时卸载AppDomain。卸载AppDomain时,将卸载所有已加载的程序集。(请参阅参考资料

要调用垃圾收集器,您可以使用

GC.Collect(); // collects all unused memory
GC.WaitForPendingFinalizers(); // wait until GC has finished its work
GC.Collect();

GC在后台线程中调用终结器,这就是为什么您必须等待并再次调用Collect()以确保删除了所有内容的原因。

2020-05-19