2012-11-30 53 views
0

我在我的dll文件裏面弄亂了我的IL代碼(只是爲了學習目的)。我想看看會發生什麼,如果我注入自己的IL代碼,例如...我扔了一個箱子電話:IL_9999: box !T。我想知道是否偏移值實際上很重要,雖然...我是否通過將IL代碼編織爲IL_9999而傷害了我的應用程序的性能?

IL偏移量爲9999的性能價格比IL偏移量爲1000還要多嗎?我的猜測是它沒有因爲編譯器本身,而爲了去,跳過偏移:如果我的IL的9999偏移扔進這些IL的中間偏移

IL_000d: ldc.i4.3 
IL_000e: box  [mscorlib]System.Int32 
IL_0013: call  instance int32 [mscorlib]System.Enum::CompareTo(object) 
IL_0018: call  void [mscorlib]System.Console::WriteLine(int32) 
IL_001d: nop 

而且,它傷害我的應用價值低得多的呼叫?

+4

這沒有任何意義,IL_000d:註釋是反彙編器顯示的內容。當你編寫你自己的IL或者使用Reflection時,你實際上並沒有自己編寫它。或者使用Reflection.Emit –

+0

@HansPassant:對不起,如果我不清楚......我使用反彙編程序來到我的DLL的IL。那就是我在玩的地方。 –

+0

@ m-y但反彙編器通常不會讓你修改代碼。 – svick

回答

4

所有這些IL_XXXX:都不是實際的偏移量,它們是標籤。只是反編譯器傾向於爲每條指令添加一個標籤並根據其偏移量命名它。這是因爲標籤名稱未在編譯後的代碼中保存(例如,即使保留了C#,編譯後的C#也可能沒有有意義的標籤名稱),並且反編譯器至少需要在分支指令中使用某些標籤。因此,如果您修改「偏移量」然後使用ilasm編譯代碼,則實際上不會以任何方式更改代碼。因此,它不會對性能產生任何影響。

您可以驗證此方法的一種方法是再次反編譯修改後的程序集。

+0

啊,你是正確的先生。編譯完成後,我對庫進行了反編譯,並對標籤進行了重新組織(再次)。我想標籤就是這樣,一個標籤,它似乎不會影響任何性能。謝謝! –

相關問題