2014-01-08 26 views
1

當我將Visual Studio 2012的反彙編窗口用於C#項目時,我期望看到IL代碼。但它顯示了x64組裝。這是由抖動造成的嗎?下面的程序集是反彙編代碼的一部分。爲什麼VS 2012 C#的反彙編窗口顯示x64程序集而不是IL?

 public static void Main() { 
00000000 sub   rsp,1C8h 
00000007 xor   eax,eax 
00000009 mov   qword ptr [rsp+60h],rax 
0000000e mov   qword ptr [rsp+58h],rax 
00000013 mov   qword ptr [rsp+50h],rax 
00000018 mov   qword ptr [rsp+38h],rax 
0000001d mov   qword ptr [rsp+30h],rax 
00000022 mov   qword ptr [rsp+28h],rax 
00000027 mov   qword ptr [rsp+20h],rax 
0000002c xor   eax,eax 
0000002e mov   dword ptr [rsp+4Ch],eax 
00000032 mov   dword ptr [rsp+48h],eax 
00000036 mov   dword ptr [rsp+44h],eax 
0000003a mov   dword ptr [rsp+40h],eax 
0000003e mov   rax,7F8786239C0h 
00000048 mov   eax,dword ptr [rax] 
0000004a test  eax,eax 
0000004c je   0000000000000053 
0000004e call  000000005FA4647C 
+1

你的期望是錯的。反彙編窗口顯示彙編代碼,而不是IL。如果你想讓IL使用ILDasm,ILSpy等反編譯器。 –

+0

是的,把IL變成真正的可執行代碼是抖動的工作。反彙編窗口顯示該代碼。 –

回答

0

分解窗口查看直接在處理器上運行的代碼。因此它會顯示彙編而不是IL。

如果你想看到一個C#方法的原始IL再看看像反彙編器或反射的工具

+1

這不太準確。反彙編窗口使用[IDebugDisassemblyStream2](http://msdn.microsoft.com/en-us/library/bb161331.aspx)實現提供的信息,該信息可能是本機代碼,但可以很容易地[字節碼] (http://blog.280z28.org/wp-content/uploads/2013/03/JavaBytecodeDisassembly.png)。如果我不得不猜測,我會說微軟選擇使用匯編代碼實現接口,這樣開發人員可以更輕鬆地回答[像這樣的問題](http://stackoverflow.com/questions/17328641/ternary-operator-is-twice -as-慢作爲-AN-的if-else塊/ 17331230#17331230)。 –

+0

@ 280Z28是正確的,但在CLR調試引擎(這實際上是本機+ CLR引擎)時,這將始終返回彙編代碼。很多時候我希望它會返回IL,但不幸的是它沒有 – JaredPar

1

目前C#.NET調試器總是顯示方法(至少對於x86和x64)本機代碼。這是由JIT從IL生成的代碼。如果你想看IL的方法,我建議看看ILSpy