2011-11-21 17 views
5

Me gustaría comprobar qué tan grande es el código compilado de algunas clases (en bytes). Me gustaría optimizarlos para el tamaño, pero necesito saber por dónde empezar.Determinar el tamaño del código C#

+2

Está utilizando un lenguaje incorrecto. – ordag

+2

Windows Explorer? ;-) – jadarnel27

+1

¿Tiene este deseo algún razonamiento práctico detrás de él, o es puramente inactividad? – LukeH

Respuesta

3

Si desea saber el tamaño en bytes necesarios para almacenar una clase/tipo en tiempo de ejecución.

Para value types use , para reference types, use sizeof en cada campo/propiedad.


Si desea saber el tamaño de los archivos DLL administrados, la manera obvia es compilar el archivo DLL y comprobar el tamaño del archivo. Para hacer esto programáticamente, eche un vistazo a la respuesta del usuario1027167 y la clase CodeDomProvider.

Algo más que se puede hacer en el código es obtener el IL generado de cada método en sus clases, así como el sizeof de los campos como una medida de tamaño (tal vez solo relativo).

Puede usar el método MethodBase.GetMethodBody para esto.

Una vez que el Roslyn (compiler as a service) se libera (preview available) que probablemente se podría obtener con mayor facilidad y, posiblemente, con precisión (ya que no son sólo los métodos y campos que componen una clase IL.


Si desea conocer la el tamaño del código utilizado para producir una DLL, tendrá que buscar en algo así como Reflector

+0

Me gustaría saber el tamaño del código de cada clase en DLL administrado. –

+0

Cuando dice tamaño de código, ¿quiere decir el tamaño de la DLL o el tamaño del código utilizado para producir la DLL? –

+0

Tamaño del código compilado = DLL :) –

1

Suponiendo que usted quiere saber el tamaño en bytes de su código compilado yo creo que hay que compilarlo. Si desea automatizar esto, mira esto:

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; 

La variable "código" (aquí es un StringBuilder) debe contener el código fuente válido de la clase que desea medir. Después de la compilación, solo tiene que ver qué tamaño tiene el ensamblaje de salida.

+0

Tenga en cuenta que el método 'CSharpCodeProvider.CreateCompiler' ahora está obsoleto. Puede usar los métodos 'ICodeCompiler' en' CSharpCodeProvider' directamente. –

+0

Podría ser una solución. Tendría que hacer algunas refactorizaciones, pero podría funcionar. –

3

Un método será obtener el tamaño de MSIL con Reflection. Necesitará recorrer todos los métodos, Property setters and getters, y constructors para determinar el tamaño de MSIL. Además, habrá diferencias en el tamaño en función de las versiones de Debug versus Release.

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

Estaba buscando cómo encontrar el tamaño MSIL de un único método, para adivinar si un método probablemente estaría incluido, y esta fue la solución para mí. ¡Gracias! –

Cuestiones relacionadas