如何在使用反射加载装配后释放装配?

时间:2016-08-19 09:15:04

标签: c# system.reflection

我在测试中发现,多次调用以下代码会造成内存泄漏:

object obj = Activator.CreateInstance(Type.GetType(arg2.DeclaringType.FullName));
arg2.Invoke(obj, new object[] { arg3 });

对于上述代码,arg2MethodInfo类型; arg3string[]

即使我在Invoke之后添加obj = null;,似乎GAC也没有收集此对象进行清理。 (是的,我知道将对象设置为null是dispose()的一个不好的借口,但是因为这是一个通用方法,所以类中可能有或没有dispose(),并且使用已经处理的程序集进行测试,它们在使用后没有卸载)

我考虑使用一种缓存机制,其中加载的程序集存储在字典中以供后续查找,但是无法保证GAC不会在以后清理它并使字典中的该对象无法使用(以及其他灾害)。

一旦我完成它,我如何强制卸载类(类似于我可以通过调用Activate强制加载它的方式)?

1 个答案:

答案 0 :(得分:1)

让我们直截了当地you can not unload an assembly when it has been loaded unless you unload the entire Application Domain

(如果你想知道原因:check this blog

然而,对于一个不同的类,你在谈论从内存中释放它。首先,你确定没有其他对象可以访问它吗?

当你确定这一点时,知道垃圾收集器会随时释放未引用对象的内存,所以谈论内存泄漏可能有点早熟......

但你可以force the Garbage Collector to clean up the memory by calling GC.Collect()