我想检查一些类的编译代码有多大(以字节为单位)。我想优化它们的大小,但我需要知道从哪里开始。
一种方法是使用反射获取MSIL的大小。您需要循环遍历所有方法、属性设置器和获取器以及构造函数,以确定MSIL的大小。此外,基于Debug与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;
}
sizeof(type)
;对于引用类型,请对每个字段/属性使用sizeof
。
CodeDomProvider
类。sizeof
作为(可能只是相对的)大小衡量标准。假设您想知道编译后代码的字节大小,我认为您需要将其编译。如果您想自动化此过程,请看这里:
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;
CSharpCodeProvider.CreateCompiler
方法现已过时。您可以直接在 CSharpCodeProvider
上使用 ICodeCompiler
方法。 - George Duckett