2012-03-06 23 views
1

我寧願採用API方法,而不是通過CIL。有沒有我可以使用的高級框架,還是應該使用Reflection.Emit?我有什麼選擇生成.net字節碼?

UPDATE

在探索進一步我注意到,有(潛在)衝突的關於什麼是在單聲道mcs.exe C#編譯器的後端使用說明。 Some表示「Mono C#編譯器通過使用System.Reflection.Emit API生成ECMA CIL圖像」,而elsewhere指出截至2011年9月,mcs使用IKVM.NET implementation來生成字節碼。

+1

C#是一個相當 「高層次的框架」 生成CIL :) – 2012-03-06 08:43:44

+0

太含糊。也許http://cciast.codeplex.com/ – 2012-03-06 12:00:43

+0

對於缺乏細節的道歉 - 我在一次顛簸的巴士旅行中在手機上快速寫下了它。我的意思是編譯器標籤,表明我需要使用這個框架作爲編譯器的代碼生成後端。 – 2012-03-06 22:38:57

回答

0

字節碼是不高的水平。如果你想生成在高位字節碼,以適當的語言寫的,如果你想生成的字節碼使用編譯器... :)

,它是根據定義低水平。

它是什麼,要達到什麼目的?也許有可能使用其他技術而不是IL發射?沒有使用IL的情況下,有很多方法可以在.net中處理類運行時。

+0

有一些輔助API具有較高的抽象級別來協助發送IL /字節碼。我記得幾年前在代碼項目中提到過一個,但我不記得這個名字。它可能在幾年前被放棄。 – 2012-03-06 22:45:52

2

這取決於你想要達到的目的非常多。不知道你的特定情況,很難爲這項工作建議正確的工具。

如果您需要在運行時生成動態方法,Reflection.Emit非常適合。如果您想修改裝配,請查看Mono.Cecil。請記住,所有這些工具都需要了解.NET元數據和MSIL。但是,如果您想要做某些事情,例如檢查或修改類型或方法,您可能需要查看AOP解決方案,如PostSharp。它會讓你在比MSIL更高的層次上表達這些需求。

同樣,這一切在很大程度上取決於你的用例。

聲明:我在SharpCrafters工作,PostSharp的創造者

+0

我正在考慮爲編譯器創建後端代碼生成。我當然可以生成文本IL,但寧願能夠直接流到字節碼,而不必有額外的通過來轉換IL。 – 2012-03-06 22:33:37

+0

因此,像postsharp這樣的IL重寫器或基於C#的框架強制使用特定形式的語義可能不適合我需要的。 – 2012-03-06 22:35:39