Bellekteki bir derleme oluşturmak için CSharpCodeProvider.CompileAssemblyFromSource kullanan bazı C# kodlarım var. Toplama çöp toplandıktan sonra, başvurum derlemeyi oluşturmadan önce olduğundan daha fazla bellek kullanıyor. Kodum bir ASP.NET web uygulamasında, ancak bu sorunu bir WinForm'da kopyaladım. Büyümeyi ölçmek için System.GC.GetTotalMemory (true) ve Red Gate ANTS Bellek Profilcisi kullanıyorum (örnek kodla yaklaşık 600 bayt).CompileAssemblyFromSource belleğini sızmasını nasıl önleyebilirim?
Yaptığım aramadan, sızıntıların yeni tiplerin oluşturulmasından kaynaklandığını, gerçekten de referansları tuttuğum herhangi bir nesneden kaynaklanmadığını duydum. Bulduğum web sayfalarından bazıları, AppDomain hakkında bir şeyden bahsetti, ama ben anlamıyorum. Birisi burada neler olduğunu ve nasıl düzeltileceğini açıklayabilir mi? Bu soru ile ilgili olabilir: 1
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;
}
}
Güncelleme: 2 Dynamically loading and unloading a a dll generated using CSharpCodeProvider
Güncelleme: Burada
sızıntı için bazı örnek kod daha uygulama alanlarını anlamaya çalışırken, bunu buldum: What is an application domain - an explanation for .Net beginnersGüncelleme 3: Netleştirmek için, ben looki'yim Yukarıdaki kodla aynı işlevi (çözümlenen kodlara derleme ve erişim sağlama) sağlayan bir çözüm için bellek sızıntısı olmadan. Çözüm, yeni bir AppDomain ve marshaling oluşturmayı içerecek gibi görünüyor.
Çok serin bir soru. Bunu, bugünün sonuna kadar başka bir AppDomain kullanarak nasıl yapacağımıza dair bir örnek vereceğim (şu anda öğle yemeği yiyorum, sonra işe geri dönüyorum ...). – Charles
Ortaya çıkan montaj ile ne yapmayı düşünüyorsunuz? Sadece bir defaya mahsus olmak mı yoksa üzerinde durmak mı? – madaboutcode
@LightX Bir süreliğine ona dayanacağım ve gerektiğinde üyelerini çağırıyorum, ancak kaynak kodun yeni bir sürümü mevcut olduğunda, onu dökmek ve yeni bir derleme oluşturmak istiyorum. yeni kod. AppDomain düzeltmesi olmadan, tekrar eden derlemeler oluşturmaya yönelik bu döngü (eski sürümlere başvurmama rağmen), bellek kullanımının artmasına neden olur. – Nogwater