卸载使用Assembly.LoadFrom()加载的程序集

我需要检查加载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是否足够好?
  • 有没有一种明确的方式来调用垃圾回收器来回收分配给组装的资源?

不幸的是,一旦它被加载,你就不能卸载程序集。 但是你可以卸载一个AppDomain。 你可以做的是创build一个新的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()以确保删除了所有内容。

你可以使用另一个AppDomain?

 AppDomain dom = AppDomain.CreateDomain("some"); AssemblyName assemblyName = new AssemblyName(); assemblyName.CodeBase = pathToAssembly; Assembly assembly = dom.Load(assemblyName); Type [] types = assembly.GetTypes(); AppDomain.Unload(dom); 

您可以使用LoadFile.ReadAllBytes()来代替使用LoadFrom()LoadFile() File.ReadAllBytes() 。 有了它,它不使用程序集文件,但将读取它并使用读取数据。

你的代码会看起来像

 Assembly assem = Assembly.Load(File.ReadAllBytes(filePath)); sw = Stopwatch.StartNew(); var types1 = assem.GetTypes(); sw.Stop(); double time1 = sw.Elapsed.TotalMilliseconds; 

希望这可以帮助。:)

您不能从当前AppDomain卸载程序集。 但是您可以创build新的AppDomain,将程序集加载到它中,在新的AppDomain中执行一些代码,然后卸载它。 检查以下链接: MSDN