我想检查一些类的编译代码有多大(以字节为单位)。我想根据尺寸优化它们,但我需要知道从哪里开始。
答案 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)必须包含您要测量的类的有效源代码。编译后,您只需查看输出程序集的大小。