Wie kann ich verhindern, dass CompileAssemblyFromSource Speicher verliert?

Ich habe einige C # -Code, der CSharpCodeProvider.CompileAssemblyFromSource verwendet, um eine Assembly im Speicher zu erstellen. Nach der Garbage-Collection belegt meine Anwendung mehr Speicher als vor dem Erstellen der Assembly. Mein Code befindet sich in einer ASP.NET-Webanwendung, aber ich habe dieses Problem in einer WinForm dupliziert. Ich verwende System.GC.GetTotalMemory (true) und Red Gate ANTS Memory Profiler, um das Wachstum zu messen (ca. 600 Byte mit dem Beispielcode).

Nach der Suche, die ich durchgeführt habe, klingt es so, als ob das Leck von der Erstellung neuer Typen herrührt, nicht wirklich von Objekten, auf die ich Verweise habe. Einige der Webseiten, die ich gefunden habe, haben etwas über AppDomain erwähnt, aber ich verstehe es nicht. Kann jemand erklären, was hier vor sich geht und wie man es behebt?

Hier ist ein Beispielcode für ein Leck:

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

Update 1: Diese Frage könnte zusammenhängen:Dynamisches Laden und Entladen einer mit CSharpCodeProvider generierten DLL

Update 2: Beim Versuch, Anwendungsdomänen besser zu verstehen, stellte ich Folgendes fest:Was ist eine Anwendungsdomäne - eine Erklärung für .Net-Anfänger

Update 3: Zur Verdeutlichung suche ich nach einer Lösung, die die gleiche Funktionalität wie der obige Code bietet (Kompilieren und Zugreifen auf generierten Code), ohne dass Speicherplatz verloren geht. Es sieht so aus, als würde die Lösung das Erstellen einer neuen AppDomain und das Marshalling beinhalten.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage