确定c#代码的大小

本文关键字:代码 确定 | 更新日期: 2023-09-27 18:15:14

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

确定c#代码的大小

一种方法是通过反射获取MSIL的大小。您将需要循环遍历所有方法、属性设置器和getter以及构造函数,以确定MSIL的大小。同样,基于调试版本和发布版本,大小也会有所不同。

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

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

对于值类型使用sizeof(type),对于引用类型,在每个字段/属性上使用sizeof


如果你想知道托管dll的大小,最明显的方法是编译dll并检查文件大小。要以编程方式完成此操作,请查看user1027167的答案,以及CodeDomProvider类。

在代码中可以做的其他事情是获得类中每个方法的生成IL以及字段的sizeof作为衡量(可能只是相对)大小的方法。

你可以使用MethodBase。

一旦Roslyn(编译器即服务)发布(可预览),你可能会更容易、更准确地获得它(因为它不仅仅是组成类IL的方法和字段)。


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

之类的内容。

假设你想知道你编译的代码的字节大小,我认为你必须编译它。如果你想让它自动化,看看这个:

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)必须包含你想要度量的类的有效源代码。编译后,您只需要查看输出程序集的大小。