Como posso evitar que o CompileAssemblyFromSource vaze memória?
Eu tenho um código c # que está usando CSharpCodeProvider.CompileAssemblyFromSource para criar um assembly na memória. Depois que o assembly tiver sido coletado como lixo, meu aplicativo usa mais memória do que antes de criar o assembly. Meu código está em um aplicativo da web do asp.net, mas eu tenho duplicado esse problema em um WinForm. Estou usando System.GC.GetTotalMemory (true) e Red Gate ANTS Memory Profiler para medir o crescimento (cerca de 600 bytes com o código de exemplo).
A partir da pesquisa que fiz, parece que o vazamento vem da criação de novos tipos, não de objetos que eu estou mantendo referências. Algumas das páginas da web que encontrei mencionaram algo sobre o AppDomain, mas eu não entendo. Alguém pode explicar o que está acontecendo aqui e como consertar isso?
Veja um exemplo de código para vazamento:
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;
}
}
Atualização 1: Esta questão pode estar relacionada:Carregar e descarregar dinamicamente uma dll gerada usando CSharpCodeProvider
Atualização 2: Tentando entender mais os domínios de aplicativos, descobri o seguinte:O que é um domínio de aplicativo - uma explicação para iniciantes em .Net
Atualização 3: Para esclarecer, estou procurando uma solução que forneça a mesma funcionalidade que o código acima (compilando e fornecendo acesso ao código gerado) sem vazar memória. Parece que a solução envolverá a criação de um novo AppDomain e empacotamento.