2011-11-21 2 views
5

일부 클래스의 컴파일 된 코드가 얼마나 큰지 (바이트 단위로) 확인하고 싶습니다. 크기에 맞게 최적화하고 싶지만 어디에서 시작해야하는지 알고 싶습니다.C# 코드 크기 결정

+2

잘못된 언어를 사용하고 있습니다. – ordag

+2

Windows 탐색기? ;-) – jadarnel27

+1

이 욕망에는 그 뒤에 실제적인 추론이 있는가, 아니면 완전히 호기심이없는 호기심인가? – LukeH

답변

3

런타임에 클래스/유형을 저장하는 데 필요한 크기 (바이트 단위)를 알고 싶다면.

value types의 경우 reference types의 경우 sizeof(type)을 사용하려면 각 필드/속성에 sizeof을 사용하십시오.


관리되는 DLL의 크기를 알고 싶다면 명백한 방법은 dll을 컴파일하고 파일 크기를 확인하는 것입니다. 프로그래밍 방식으로하려면 user1027167의 대답과 CodeDomProvider 클래스를 살펴보십시오.

코드에서 수행 할 수있는 또 다른 작업은 필드의 sizeof뿐만 아니라 클래스의 각 메소드의 생성 된 일리노이를 (아마도 상대 크기 일 수도있는) 크기로 가져 오는 것입니다.

MethodBase.GetMethodBody 방법을 사용할 수 있습니다. Roslyn (compiler as a service)(preview available)을 발표되면 그것은 클래스의 IL을 만들뿐만 아니라 방법과 필드의로

당신은 아마 (정확하게, 더 쉽게 그리고 아마도 그것을 얻을 수 있습니다.


을 당신이 알고 싶다면 DLL을 생성하는 데 사용되는 코드의 크기는 다음과 같습니다. Reflector

+0

관리되는 DLL에서 각 클래스의 코드 크기를 알고 싶습니다. –

+0

코드의 크기를 말하면 DLL의 크기 또는 DLL을 생성하는 데 사용 된 코드의 크기를 의미합니까? –

+0

컴파일 된 코드의 크기 = DLL :) –

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)는 측정하려는 클래스의 유효한 소스 코드를 포함해야합니다. 컴파일 후에는 출력 어셈블리의 크기 만 살펴 봐야합니다.

+0

'CSharpCodeProvider.CreateCompiler' 메소드는 이제 폐기되었습니다. 'CSharpCodeProvider'에 직접'ICodeCompiler' 메소드를 사용할 수 있습니다. –

+0

해결책이 될 수도 있습니다. 약간의 리팩토링이 필요 하겠지만 작동 할 수도 있습니다. –

3

한 가지 방법은 Reflection을 사용하여 MSIL의 크기를 얻는 것입니다. 모든 메서드, 속성 setter 및 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; 
} 
+0

하나의 메소드의 MSIL 크기를 찾는 방법을 찾고 있었고, 메소드가 인라인 될 가능성이 있는지를 추측 할 수있었습니다. 이것이 나에게 맞는 해결책이었습니다. 감사! –