2010-09-30 110 views
1

我有一個C#應用程序,它在運行時生成.NET函數並執行它們。 爲此,它會在字符串中生成C#並調用在線C#編譯器將其轉換爲CLR以進行JIT編譯和執行。運行時編譯CLR

出於性能原因,我想是能夠產生直接CLR(以串或通過內部表示)和不使用任何編譯器(但也許JIT編譯器)執行它。

這可能嗎?我見過一些關於代碼注入的文章,但這並不完全符合法案。

謝謝!

+0

你的意思產生CIL(叫做IL)?談論「生成CLR」是沒有意義的。 – 2010-09-30 05:31:37

+0

嗯,你說得對,當然我的意思是CIL。 – 2010-10-14 00:20:07

回答

4

我懷疑System.Reflection.Emit是你追求的。特別是,如果你只想生成一個單一的方法,我相信你應該看看DynamicMethod。你可以問它到create an ILGenerator,構建IL,然後將它轉換爲代理時將JIT編譯。

我不相信你可以給它的文本IL雖然......你將要使用的API,明確地建立各種指令。有可能是IL解析器,儘管使用這個......

+0

謝謝你的回答。我看看這個namspace,特別是ILGenerator,這似乎是我正在尋找的東西。我會更詳細地研究它,特別是關於速度。 – 2010-09-30 06:07:56

0

我可能不明白的問題,但不能你,而不是從你的應用程序生成的C#代碼,實際生成相當於中間語言(IL)代碼,C#編譯器會產生呢?然後你可以直接運行IL代碼,而不必先編譯它。

+0

你是對的,所以我的問題是關於如何做到這一點。對不起,不夠清楚。 – 2010-09-30 06:09:25

2

如果你只是想創建.NET函數,Expression trees是要走的路。如果你想創建一個完整的課程,你可以使用Reflection.Emit,但是你要編寫彙編代碼。

如果您等待.Net 5,也許他們會有一個可以傳遞任意C#代碼的編譯器版本,但現在也許您可以使用使用DLR(如IronPython)的東西來傳遞實際源代碼代碼。

+0

我不知道表達樹;那些比我前一段時間使用的CODEDOM好。但我正在尋找更低級別的解決方案。 – 2010-09-30 06:10:44