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