У меня есть код С#, который использует CSharpCodeProvider.CompileAssemblyFromSource для создания сборки в памяти. После сборки сборки мусора мое приложение использует больше памяти, чем прежде, чем создавать сборку. Мой код находится в веб-приложении ASP.NET, но я дублировал эту проблему в WinForm. Я использую System.GC.GetTotalMemory(true) и Red Gate ANTS Memory Profiler для измерения роста (около 600 байтов с образцом кода).
Из поиска, который я сделал, похоже, что утечка происходит от создания новых типов, а не от каких-либо объектов, на которые я ссылаюсь. Некоторые из веб-страниц, которые я нашел, упоминали об AppDomain, но я не понимаю. Может кто-нибудь объяснить, что происходит здесь и как это исправить?
Вот пример кода для утечки:
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;
}
}
Обновление 1: Этот вопрос может быть связан: Динамическая загрузка и выгрузка dll, сгенерированной с помощью CSharpCodeProvider
Обновление 2: Попытка понять доменные приложения больше, я нашел это: Что такое домен приложения - объяснение. Чистые начинающие
Обновление 3: Чтобы уточнить, я ищу решение, которое обеспечивает те же функции, что и код выше (компиляция и обеспечение доступа к сгенерированному коду) без утечки памяти. Похоже, что решение будет включать создание нового AppDomain и маршалинга.