Jak mogę zapobiec wyciekowi pamięci przez CompileAssemblyFromSource?

Mam kod C #, który używa CSharpCodeProvider.CompileAssemblyFromSource do utworzenia złożenia w pamięci. Po zebraniu śmieci, moja aplikacja zużywa więcej pamięci niż przed utworzeniem złożenia. Mój kod znajduje się w aplikacji internetowej ASP.NET, ale zduplikowałem ten problem w WinForm. Używam System.GC.GetTotalMemory (true) i Red Gate ANTS Memory Profiler do pomiaru wzrostu (około 600 bajtów z kodem przykładowym).

Z przeszukiwania, które zrobiłem, brzmi, że wyciek pochodzi z tworzenia nowych typów, a nie z jakichkolwiek obiektów, do których odwołuję się. Niektóre strony, które znalazłem, wspomniały coś o AppDomain, ale nie rozumiem. Czy ktoś może wyjaśnić, co tu się dzieje i jak to naprawić?

Oto przykładowy kod do wycieku:

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;
    }
}

Aktualizacja 1: To pytanie może być powiązane:Dynamiczne ładowanie i rozładowywanie biblioteki DLL wygenerowanej przy użyciu CSharpCodeProvider

Aktualizacja 2: Próbując zrozumieć więcej domen aplikacji, znalazłem to:Co to jest domena aplikacji - wyjaśnienie dla początkujących użytkowników .Net

Aktualizacja 3: Aby wyjaśnić, szukam rozwiązania, które zapewnia taką samą funkcjonalność jak powyższy kod (kompilowanie i udostępnianie wygenerowanego kodu) bez wycieku pamięci. Wygląda na to, że rozwiązanie będzie wymagało utworzenia nowej domeny aplikacji i przeniesienia.

questionAnswers(3)

yourAnswerToTheQuestion