일부 클래스의 컴파일 된 코드가 얼마나 큰지 (바이트 단위로) 확인하고 싶습니다. 크기에 맞게 최적화하고 싶지만 어디에서 시작해야하는지 알고 싶습니다.C# 코드 크기 결정
답변
런타임에 클래스/유형을 저장하는 데 필요한 크기 (바이트 단위)를 알고 싶다면.
value types의 경우 reference types의 경우 sizeof(type)
을 사용하려면 각 필드/속성에 sizeof
을 사용하십시오.
관리되는 DLL의 크기를 알고 싶다면 명백한 방법은 dll을 컴파일하고 파일 크기를 확인하는 것입니다. 프로그래밍 방식으로하려면 user1027167의 대답과 CodeDomProvider
클래스를 살펴보십시오.
코드에서 수행 할 수있는 또 다른 작업은 필드의 sizeof
뿐만 아니라 클래스의 각 메소드의 생성 된 일리노이를 (아마도 상대 크기 일 수도있는) 크기로 가져 오는 것입니다.
MethodBase.GetMethodBody 방법을 사용할 수 있습니다. Roslyn (compiler as a service)가 (preview available)을 발표되면 그것은 클래스의 IL을 만들뿐만 아니라 방법과 필드의로
당신은 아마 (정확하게, 더 쉽게 그리고 아마도 그것을 얻을 수 있습니다.
을 당신이 알고 싶다면 DLL을 생성하는 데 사용되는 코드의 크기는 다음과 같습니다. Reflector
관리되는 DLL에서 각 클래스의 코드 크기를 알고 싶습니다. –
코드의 크기를 말하면 DLL의 크기 또는 DLL을 생성하는 데 사용 된 코드의 크기를 의미합니까? –
컴파일 된 코드의 크기 = DLL :) –
컴파일 된 코드의 크기를 바이트로 알고 싶다고 가정하면 컴파일해야합니다. 이걸보세요.
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)는 측정하려는 클래스의 유효한 소스 코드를 포함해야합니다. 컴파일 후에는 출력 어셈블리의 크기 만 살펴 봐야합니다.
'CSharpCodeProvider.CreateCompiler' 메소드는 이제 폐기되었습니다. 'CSharpCodeProvider'에 직접'ICodeCompiler' 메소드를 사용할 수 있습니다. –
해결책이 될 수도 있습니다. 약간의 리팩토링이 필요 하겠지만 작동 할 수도 있습니다. –
한 가지 방법은 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;
}
하나의 메소드의 MSIL 크기를 찾는 방법을 찾고 있었고, 메소드가 인라인 될 가능성이 있는지를 추측 할 수있었습니다. 이것이 나에게 맞는 해결책이었습니다. 감사! –
- 1. 결정 배열 크기
- 2. Dojo 위젯의 크기 결정
- 3. LocalSocket 읽기 크기 결정
- 4. Objective-C, 프로그래밍 방식으로 파일 크기 결정
- 5. BLOB 열의 크기 결정
- 6. silverlight 컨트롤의 크기 결정
- 7. UITableViewCell의 크기 결정
- 8. JFreeChart 그리드의 크기 결정
- 9. Ruby에서 이미지 크기 결정
- 10. 폴더 크기 결정
- 11. windows 복원 크기 결정
- 12. 결정 론적 어닐링 코드
- 13. LOC를 사용하여 프로젝트 크기 결정
- 14. 프로세서의 캐시 섹터 크기 결정
- 15. C# 코드 크기 및 코드 실행 시간
- 16. 코드 섹션 길이 결정
- 17. Delphi 실시간 파일 크기 결정
- 18. 입력 배열의 크기 결정 plpgsql
- 19. 자바 스크립트 게시 크기 결정
- 20. xslt를 사용한 그래픽의 크기 결정
- 21. 메모리의 함수/스텁/네임 스페이스 크기 결정
- 22. .net 메모리 사용량, 개인용 바이트 크기 결정
- 23. Android OpenGLES의 최대/최소 텍스처 크기 결정
- 24. .NET CIL 코드 크기
- 25. C++ 전 처리기 결정
- 26. 클래스가 참조되는지 결정 C#
- 27. C#을, * 결정
- 28. C# 개체 유형 결정
- 29. C 프로그램을위한 공간 결정
- 30. C# 제네릭 유형 결정
잘못된 언어를 사용하고 있습니다. – ordag
Windows 탐색기? ;-) – jadarnel27
이 욕망에는 그 뒤에 실제적인 추론이 있는가, 아니면 완전히 호기심이없는 호기심인가? – LukeH