C # 컴파일러로 생성 된 MSIL / CIL을 어떻게 볼 수 있습니까? 왜 조립이라고 불리는가?


130

.NET C # 프로그래밍을 처음 사용합니다. 나는 몇 권의 책을 따르고 있습니다. 이진 코드 (네이티브 코드)로 직접 컴파일하는 것이 아니라고합니다. 고급 코드는 중간 언어 (MSIL, 일명 CIL)로 변환됩니다. 그러나 컴파일 할 때 exe / Dll 파일을 얻습니다.

  1. 이 MSIL / CIL이이 exe / dll 파일에 포함되어 있습니까?
  2. 그 중간 언어 코드를보고 싶습니다. 그것의 존재를 느끼기 위해. 그것을 보는 방법?
  3. 그들은이 exe / dll 파일을이라고 부릅니다 assembly. 그들은이 "공상 단어"를 사용하여 이진 코드 (네이티브 코드)를 포함하는 exe / dll 파일과 구별 할 수 있습니까?

답변:


95
  1. .text, PE 파일 의 섹션에 있습니다 (휴대용 실행 가능 = * .exe 또는 * .dll). 자세한 내용은 여기를 참조하십시오 .
  2. 최선의 선택은 ILSpy 를 사용하는 것입니다 (반사기는 더 이상 무료가 아닙니다). 어셈블리를 MSIL과 C #, VB로 어느 정도 분해 할 수있는 무료 디스어셈블러입니다. .NET Framework SDK에는 공식 MSIL dissasembler 인 ILDasm이 포함되어 있습니다.
  3. 기본적으로 그렇습니다. 어셈블리는 MSIL 코드와 해당 메타 데이터가 포함 된 파일입니다. 이것은 PE 파일 자체에만 국한되지 않지만 모든 현재 CLR 구현에서 사용됩니다.

그 문제에 대해서도 좋은 책을 추천한다면 Serge Lidin의 Expert .NET 2.0 IL 어셈블러입니다. 그는 MSIL을 디자인 한 사람입니다.


기다림! .textsextion 에 있지 않습니까? 그렇지 않은 경우 무엇을 .text포함합니까? 그리고 #내가 생각한 섹션의 내용은로 시작합니다 .. 그러니 영혼이 아니에요.strings

궁금합니다. 왜 ILDasm 이 권장되지 않습니까? Visual Studio에만 포함되어 있습니까?
Sinjai

2
둘 다 자신의 위치를 ​​가지고 있지만 대부분의 (> 99.99 %) 사용자에게는 ILSpy가 올바른 선택입니다. IL 코드를 C #으로 다시 컴파일하는 기능은 어셈블리를 빠르게 탐색하고 리버스 엔지니어링하는 데 매우 중요합니다. 원시 IL을 방출하는 모든 작업을 수행하는 경우 (예 : 컴파일러를 작성하거나 어셈블리 IL, 예를 들어 Mono.Cecil을 사용하여 다시 작성하는 경우) ILDasm은 IL의 원시 구조, 토큰 테이블 등을 보여줄 수 있기 때문에 유용합니다. , 대부분의 비 IL 전문가는 혼란 스러울 것이므로 ILSpy가 원하는 전부일 것입니다.
Johannes Rudolph

3
와우, 7 년 후 신속한 대응! IL을 많이 망쳐 놓지 않았거나 모든 옵션을 비교했지만 (처음에 묻는 이유) LINQPad에는이 디 컴파일 기능이 없습니까?
Sinjai

VS 2017에 설치했지만 ILSPY의 코드를 클릭하면 아무 일도 일어나지 않습니다.
Anirudha Gupta 5

46

C # 스 니펫 에 대해 IL을 보는 가장 좋아하는 방법 중 하나는 무료 LINQPad 도구 를 사용하는 것 입니다. 코드를 입력하고 상단의 "C # 문"(또는 "C # 프로그램"중 적합한 것)을 선택한 후 코드 입력 영역 아래에서 "IL"버튼을 클릭하면 생성 된 IL이 표시됩니다.

이를 위해 LINQPad를 사용하는 것은 Visual Studio를로드하거나 명령 줄에서 컴파일러를 실행 한 다음 ILDASM을로드하고 텍스트 편집기로 .il 파일을 여는 것보다 훨씬 편리합니다.


또 다른 좋은 도구는 Reflector 용 Snippy 애드 인입니다
Thomas Levesque

좋은 것! 나는 투표했지만 사용자 정의 클래스를 포함 해야하는 경우 약간 더 복잡합니다. 아직도, 나는 이것을 정말로 좋아한다!
Andrew Steitz

28

온라인으로 원한다면 .NET Fiddle 이 훌륭합니다. 코드를 붙여넣고 View IL오른쪽 상단의 옵션을 클릭하십시오 .


2
이제 고장난 것 같습니다.
Luke Maurer

@nawfal도 여기서 파산했습니다. 나는 그것을 사용했다.
aloisdg codidact.com으로 이동

다른 온라인 솔루션이 있습니다 : sharplab.io . 자세한 내용은이 답변을 확인하십시오. stackoverflow.com/a/51457583/1248177
aloisdg codidact.com으로 이동

문제가 무엇인지 잘 모르면 저에게 잘 작동합니다. @ aloisdgmovingtocodidact.com. 그것은 지적했다. # :
02

16

다른 옵션 : ReSharper 사용

여기에 이미지 설명을 입력하십시오 소스 / IL 동기화보기 : 왼쪽 파란색 배경 라인이 오른쪽 IL 블록에 해당

Visual Studio에서 :

  • ReSharper를 선택하십시오 | 윈도우 | IL 뷰어
  • 또는 상황에 맞는 메뉴 : 탐색 | IL 코드

소스 코드와 IL의 동기화 된 뷰를 지원합니다. 소스에서 명령문을 클릭하면 IL의 해당 블록이 강조 표시됩니다 (반대도 마찬가지). Microsoft Developer Network의 IL 및 ECMA 표준 사양의 "CIL (Common Intermediate Language) 명령어 세트"에 대한 설명을 표시합니다.

IL (Intermediate Language)보기를 참조하십시오.Resharper 도움말의 . 위의 그림은 Resharper 도움말에서 가져온 것입니다.

무료 옵션은 Jetbrains dotPeek 를 사용하는 것입니다

또한보십시오 : "ReSharper와 dotPeek를 이용한 중급 언어 (IL) 탐구", Maarten Balliauw, 2017 년 1 월 19 일-Jetbrains Blog


당신의 대답을 잘못 하향식했습니다. 내가
투표

ReSharper의 IL 뷰어는 훌륭합니다. IL 구문 위로 마우스를 가져 가면 각 키워드의 기능을 설명하는 툴팁이 표시됩니다. IL을 처음 접하는 사람들에게 좋습니다!
InvalidBrainException



9

샤프 랩 sharplab 은 간단한 사용 사례에 적합한 온라인 도구입니다. 왼쪽에 코드를 입력하면 IL이 오른쪽에 표시됩니다.


최고의 도구 +1
Emad

7

여러 측면에서 .NET 어셈블리는 Java 바이트 코드 패키지와 유사합니다.

  1. 예. 또한 매니페스트 및 기타 데이터가 포함되어 있지만 CIL은 exe / dll의 일부입니다.
  2. ILDasm 또는 Reflector를 사용하십시오. 대부분의 사람들은 Reflector가 훨씬 강력하기 때문에 말할 것입니다. 둘 다 CIL이 생산 된 것을 보여줄 것입니다. Wikipedia에는 ​​모든 CIL 명령어 목록이 있습니다. 더 나은 느낌을 위해 이 있습니다 (조립과 유사 함).
  3. 나는 그것이 코드 어셈블리라고 생각합니다. 네이티브와 차별화하는 좋은 방법입니다.


5

나는 이것이 오래된 질문이라는 것을 알고 있으며 위의 도구 중 하나를 선호합니다. 그러나 핀치하게도 적어도 2005 년 이후 Visual Studio와 함께 MSIL 뷰어가 제공되었습니다.

이 도구의 이름 ildasm.exe은이며 기본 Visual Studio 설치 후 다음 폴더에 있습니다.

Visual Studio 2005 "C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 " C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe"

Visual Studio 2010 " C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe"

자세한 내용 은 MSDN Library의 " 방법 : 어셈블리 내용보기 "를 참조하십시오 .


2

내 경험상 IL 관련 지식의 가장 좋은 출처는 Andrew Troelsen“Pro C # and .NET Platform”입니다. 그는 3 판부터 IL을 이해하고 자신의 코드를 작성하고 ILAsm을 사용하는 방법에 대해 정말 뛰어난 장 (약 50 페이지)을 가지고 있습니다. 이 정보를 사용하여 .NET 세계에 다중 상속이 있는지 여부를 조사했습니다. 또한 IL에서 매우 흥미로운 기능을 사용하려고 시도 할 수 있습니다 (예 : VB에만 존재하지만 C #에는없는 예외 필터링).

그 장을 읽는 것이 좋습니다.

결국 .NET Reflector는 IL 코드 어셈블리를 조사하기위한 엔터프라이즈 표준이며 Richter의 책은 반드시 "읽어야합니다". 그러나 위에서 언급 한 다른 책에서 실제로 유용한 것들을 밝힐 수 있습니다 :)

예. .NET 세계의 각 어셈블리에는 Reflector 또는 ILDasm을 통해 볼 수있는 일부 IL 코드 (매니페스트 포함)가 있습니다. 또한 Reflector는 C # 및 VB 최적화 코드를 보여줄 수 있습니다. 이것은 모든 사람이 어셈블리의 소스 코드를 볼 수 있고 상용 제품 난독 화 장치를 사용하는 이유입니다.


2

중간 언어를보고 싶습니다. Telerik에서 JustDecompile을 다운로드하십시오. (현재 무료이며 가입이 필요합니다).

DLL을 드래그하여 IL 하여 상단의 드롭 다운 상자에서 !


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.