pro*_*eek 51 c# garbage-collection load gettype
我需要检查加载dll后运行GetTypes()的时间量.代码如下.
Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
Run Code Online (Sandbox Code Playgroud)
我想卸载并重新加载dll以检查再次运行GetTypes()所花费的时间.
assem = null够好吗?小智 69
你可以使用另一个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);
Run Code Online (Sandbox Code Playgroud)
slf*_*fan 34
遗憾的是,加载后无法卸载组件.但是您可以卸载AppDomain.您可以做的是创建一个新的AppDomain(AppDomain.CreateDomain(...)),将程序集加载到此appdomain中以使用它,然后在需要时卸载AppDomain.卸载AppDomain时,将卸载已加载的所有程序集.(见参考)
要调用垃圾收集器,您可以使用
GC.Collect(); // collects all unused memory
GC.WaitForPendingFinalizers(); // wait until GC has finished its work
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
GC在后台线程中调用终结器,这就是为什么你必须等待并再次调用Collect()以确保删除所有内容.
Har*_*dik 34
而不是使用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;
Run Code Online (Sandbox Code Playgroud)
从这里我们无法卸载该文件,除非卸载其中包含的所有域.
希望这可以帮助.:)