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.

questionAnswers(3)

yourAnswerToTheQuestion