为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
森栏 2019-11-14 15:10:47
加载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的资源?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

不幸的是,一旦装配被加载,您将无法卸载装配。但是您可以卸载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()以确保删除了所有内容的原因。


查看完整回答
反对 回复 2019-11-14
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

而不是使用LoadFrom()或LoadFile()可以使用Load与File.ReadAllBytes()。这样,它将不使用汇编文件,而是将其读取并使用读取的数据。


您的代码将如下所示


Assembly assem = Assembly.Load(File.ReadAllBytes(filePath));

sw = Stopwatch.StartNew();

var types1 = assem.GetTypes();

sw.Stop();

double time1 = sw.Elapsed.TotalMilliseconds;

从这里开始,除非文件包含的所有域都被卸载,否则我们无法卸载文件。



查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 788 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信