2010-07-25 96 views

回答

3

如果內嵌IL(由C和C++編譯器支持內聯彙編的同樣的精神)是你要找的是什麼,這可以用編譯後的往返編譯來實現。

邁克失速曾經寫a tool for that,據我知道這是相當成熟:比

其他,你可以使用支持內嵌IL F#。

2

您需要的工具叫做Cecil,它是Mono項目的一部分。

你可以得到關於它在這裏的更多信息:http://www.mono-project.com/Cecil

從上面的網站引用:

塞西爾是JB Evain(http://evain.net/blog/)編寫的庫,產生和檢查的程序和庫ECMA CIL格式。它全面支持泛型,並支持一些調試符號格式。

用簡單的英語,用Cecil,您可以加載現有的託管程序集,瀏覽所有包含的類型,實時修改它們並將修改後的程序集保存到磁盤。

2

DynamicMethod是在運行時完成此操作的輕量級方法。

Microsoft C#編譯器不支持在編譯時注入IL,但代碼編織工具可以作爲後編譯步驟。

9

我只是posted a utility它允許使用自定義屬性將整個C#函數體自動地用內聯IL替換。與類似的實用程序類似,這可以通過ILDASM/ILASM往返來實現,可以將其設置爲構建後步驟。該工具還會調整PDB,以便在調試器中保留單步執行和設置單個IL指令的斷點。這是不同之處在於,其他一些往返IL排滑輪鞋的它(只)可替代全功能的機構,就像這樣:

class MyClass 
    { 
     [ILFunc(@" 
    .locals init ([0] int32 i_arg) 
     ldc.i4.3 
     ret 
    ")] 
     int MyFunc(int i_arg) 
     { 
      return 3; 
     } 
    }; 

對於高績效的關鍵方法,我嘗試使用DynamicMethod以在反編譯提高生成的IL,但發現由於委託調用開銷而損失了好處。如果沒有運行時自定義,那麼內聯IL給出了手動調整IL的好處,而不是那種命中,假設您確實需要DynamicMethod

完整的源代碼位於http://www.glennslayden.com/code/c-sharp/inline-il

+0

沒有找到你的lib任何ILFunc屬性。 – Denis 2016-08-14 15:49:27

+0

@Denis我不認爲我提供了一個庫。它是源代碼,並且網頁上有兩個文件。第二個(向下滾動到附加文本之外)包含ILFunc'Attribute'本身的定義。 – 2017-02-01 21:50:08

+0

真是太棒了!謝謝! – Thought 2017-11-18 23:50:09