У меня есть код C#, который использует CSharpCodeProvider.CompileAssemblyFromSource для создания сборки в памяти. После сборки мусора мое приложение использует больше памяти, чем до создания сборки. Мой код находится в веб-приложении ASP.NET, но я продублировал эту проблему в WinForm. Я использую System.GC.GetTotalMemory(true) и профилировщик памяти Red Gate ANTS для измерения роста (около 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. Пытаясь лучше понять домены приложений, я обнаружил следующее: Что такое домен приложения — пояснение для новичков в .Net
Обновление 3. Чтобы уточнить, я ищу решение, которое обеспечивает ту же функциональность, что и приведенный выше код (компиляция и предоставление доступа к сгенерированному коду) без утечки памяти. Похоже, решение будет включать создание нового AppDomain и маршалинг.