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.