我有一些 C# 代码使用 CSharpCodeProvider.CompileAssemblyFromSource 在内存中创建程序集。程序集被垃圾回收后,我的应用程序使用的内存比创建程序集之前更多。我的代码在 ASP.NET Web 应用程序中,但我在 WinForm 中复制了这个问题。我正在使用 System.GC.GetTotalMemory(true) 和 Red Gate ANTS Memory Profiler 来测量增长(示例代码约为 600 字节)。
从我所做的搜索来看,听起来泄漏来自新类型的创建,而不是来自我持有引用的任何对象。我发现的一些网页中提到了一些关于 AppDomain 的内容,但我不明白。有人可以解释这里发生了什么以及如何解决它吗?
这是一些泄漏的示例代码:
private void leak()
{
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = false;
parameters.ReferencedAssemblies.Add("system.dll");
string sourceCode = "using System;\r\n";
sourceCode += "public class HelloWord {\r\n";
sourceCode += " public HelloWord() {\r\n";
sourceCode += " Console.WriteLine(\"hello world\");\r\n";
sourceCode += " }\r\n";
sourceCode += "}\r\n";
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sourceCode);
Assembly assembly = null;
if (!results.Errors.HasErrors)
{
assembly = results.CompiledAssembly;
}
}
更新1:这个问题可能是相关的:Dynamically loading and unloading aa dll generated using CSharpCodeProvider
更新 2:试图更多地了解应用程序域,我发现:什么是应用程序域 - .Net 初学者的解释
更新 3:为了澄清,我正在寻找一种解决方案,它提供与上述代码相同的功能(编译并提供对生成代码的访问)而不会泄漏内存。看起来该解决方案将涉及创建新的 AppDomain 和封送处理。