确定C#代码大小

时间:2011-11-21 13:45:14

标签: c# .net

我想检查一些类的编译代码有多大(以字节为单位)。我想根据尺寸优化它们,但我需要知道从哪里开始。

3 个答案:

答案 0 :(得分:3)

如果您想知道在运行时存储类/类型所需的字节大小。

对于value types使用sizeof(type),对于reference types,请在每个字段/属性上使用sizeof


如果您想知道托管DLL的大小,显而易见的方法是编译dll并检查文件大小。要以编程方式执行此操作,请查看user1027167的答案和CodeDomProvider类。

在代码中可以执行的其他操作是获取类中每个方法的生成IL以及字段sizeof作为(可能只是相对)大小的度量。

您可以使用MethodBase.GetMethodBody方法。

Roslyn (compiler as a service)一旦发布(preview available),您就可以更轻松,更准确地获取它(因为它不仅仅是构成一个类'IL的方法和字段。


如果您想知道用于生成DLL的代码的大小,您必须查看Reflector

之类的内容。

答案 1 :(得分:3)

一种方法是使用Reflection获取MSIL的大小。您需要循环遍历所有方法,属性设置器和getter以及构造函数,以确定MSIL的大小。此外,基于Debug版本和发布版本的大小也会有所不同。

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;
}

答案 2 :(得分:1)

假设您想知道已编译代码的大小(以字节为单位),我认为您必须编译它。如果您想自动化它,请查看:

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;

变量“code”(此处为StringBuilder)必须包含您要测量的类的有效源代码。编译后,您只需查看输出程序集的大小。