2011-11-21 30 views
5

Bazı sınıfların derlenmiş kodlarının (bayt cinsinden) ne kadar büyük olduğunu kontrol etmek istiyorum. Onları boyut için optimize etmek isterim, ama nereden başlayacağımı bilmem gerek.C# Kod boyutunu belirle

+2

Yanlış bir dil kullanıyoruz. – ordag

+2

Windows Gezgini? ;-) – jadarnel27

+1

Bu arzun arkasında herhangi bir pratik akıl yürütme var mı, yoksa tamamen boşta merak mı? – LukeH

cevap

3

çalışma zamanında bir sınıf/tür saklamak için gereken bayt olarak boyutunu bilmek istiyorsanız.

value types için için, her alan/özellikte sizeof kullanın.


yönetilen dll boyutunu bilmek istiyorsanız

, açık yolu dll derlemek ve dosya boyutunu kontrol etmektir. Bunu programatik olarak yapmak için, user1027167'nin cevabına ve CodeDomProvider sınıfına bir göz atın.

Kodda yapılabilecek başka bir şey, sınıflarınızdaki her yöntemin oluşturulmuş IL'sini ve (belki de yalnızca göreceli) bir ölçüsü olarak sizeof alanlarını elde etmektir.

Bunun için MethodBase.GetMethodBody yöntemi kullanabilirsiniz. Roslyn (compiler as a service)(preview available) yayınlandıktan sonra bir sınıf IL oluşturan sadece yöntemleri ve alanları olduğu gibi

muhtemelen (doğrusu daha kolay ve muhtemelen bunu alabilir.


Eğer bilmek istiyorsanız Bir DLL üretmek için kullanılan kod boyutu, Reflector

+0

Yönetilen DLL'deki her sınıfın kod boyutunu bilmek istiyorum. –

+0

Kod boyutu derken, DLL boyutunu veya DLL'yi üretmek için kullanılan kod boyutunu mı kastediyorsunuz? –

+0

Derlenmiş kodun boyutu = DLL :) –

1

gibi bir şeye bakmak zorundasınız Derlenmiş kodunuzun bayt cinsinden boyutunu bilmek istediğinizi varsayalım, bunu derlemelisiniz. it, şuna bak:

"
ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler()); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("system.dll"); 
cp.ReferencedAssemblies.Add("system.data.dll"); 
cp.ReferencedAssemblies.Add("system.xml.dll"); 
cp.GenerateExecutable = false; 
cp.GenerateInMemory = true; 
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString()); 
if (cr.Errors.HasErrors) 
{ 
    StringBuilder error = new StringBuilder(); 
    error.Append("Error Compiling Expression: "); 
    foreach (CompilerError err in cr.Errors) 
    { 
     error.AppendFormat("{0}\n", err.ErrorText); 
    } 
    throw new Exception("Error Compiling Expression: " + error.ToString()); 
} 
Assembly a = cr.CompiledAssembly; 

" Kod "değişkeni (burada bir StringBuilder), ölçmek istediğiniz sınıfınızın geçerli kaynak kodunu içermelidir. Derlemeden sonra sadece çıkış düzeneğinin boyutuna bakmak zorundasınız.

+0

'CSharpCodeProvider.CreateCompiler' yönteminin artık kullanılmadığını unutmayın. "CSharpCodeProvider" üzerindeki 'ICodeCompiler' yöntemlerini doğrudan kullanabilirsiniz. –

+0

Bir çözüm olabilir. Bazı refactoring yapmak zorundayım, ama işe yarayabilir. –

3

bir yöntemi Yansıma ile MSIL boyutunu almak olacaktır. MSIL'in boyutunu belirlemek için tüm yöntemler, Özellik belirteçleri ve alıcılar ve kurucular arasında geçiş yapmanız gerekir. Ayrıca, Debug ve Release sürümlerine dayanan boyut farklılıkları olacaktır.

using System.Reflection; 

int totalSize = 0; 

foreach(var mi in typeof(Example).GetMethods(BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Static | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.SetProperty)) 
{ 
    MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample"); 
    MethodBody mb = mi.GetMethodBody(); 
    totalSize += mb.GetILAsByteArray().Length; 
} 
+0

Tek bir yöntemin MSIL boyutunu nasıl bulacağımı araştırıyordum, bir yöntemin belirtilip çizilmeyeceğini tahmin ediyordum ve bu benim için bir çözümdü. Teşekkürler! –