从我所做的搜索中看来,泄漏似乎来自于新类型的创建,而不是我持有引用的任何对象。我找到的一些网页提到了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:这个问题可能与以下问题有关:使用CSharpCodeProvider动态加载和卸载生成的dll
更新 2:为了更好地理解应用程序域,我找到了这篇文章:什么是应用程序域——面向.NET初学者的解释
更新 3:澄清一下,我正在寻找一种提供与上述代码相同功能(编译并提供对生成代码的访问),但不会泄漏内存的解决方案。看起来解决方案将涉及创建一个新的AppDomain并进行封送。