2012-01-09 36 views
3

我目前正在編寫一些代碼,我想知道是否可以從我的應用程序執行一些C#代碼。我會給你一個想法,讓我們說我想給用戶一個文本框,讓他們鍵入一些代碼,然後打開,我想他們要求一個水果列表,然後通過每個水果,並輸出它..一個例如:有沒有辦法在應用程序中解析/運行C#,就像腳本一樣?

var fruitList = getFruit(); 
foreach(var fruit in fruitList) 
{ 
    print(fruit.Name); 
} 

我希望能夠通過這個和分配水果對象fruitList列表,解析器應該能夠getFruit()綁到我寫在C#中的方法碼。打印也是如此,它應該將它等同於我寫的將輸出到文本框的打印函數。

現在我知道C#不是一個腳本,它被編譯,我做了很多谷歌搜索,但無法找到任何東西。我唯一的選擇似乎是自己編寫一個小語言解析器 - 這聽起來很有趣 - 但我之前完成了這個工作,而且我知道這很難。所以這只是一個初步檢查,看看在我承諾長期以前是否存在某種解決方案。

所以,我的同事程序員,你知道任何可能能夠幫助我嗎?

如果不是,沒問題,我非常感謝所有反饋,無論是提示,建議,鏈接到文章,如http://blogs.msdn.com/b/ericwhite/archive/2010/06/29/writing-a-recursive-descent-parser-using-c-and-linq.aspx或解決方案。

問候,
亞當

編輯:我已經得到了一個工作示例。注意這段代碼有點亂,因爲我已經將一些其他代碼粘貼到測試應用程序中,但它可以工作。基本上,我將代碼編譯成DLL,然後加載DLL,找到類型,找到方法並調用它。這太快了!我不想垃圾郵件你這麼完整的代碼如下:

http://imdsm.blogspot.com/2012/01/compile-c-into-assembly-then-load-it.html

感謝大家誰張貼在這裏。你剛剛救了我幾天的困惑!

回答

3

你的意思是想在這個截圖here

我們在我們的軟件HeuristicLab中使用此軟件,您可以將ProgrammableOperator添加到運算符圖表中,該運算符圖表將執行您在自定義算法中鍵入的地方輸入的代碼。

System.CodeDom命名空間中,您已經擁有了動態編譯代碼所需的全部功能。您可以從編譯創建一個程序集,獲取程序集的類型並執行它們的代碼。

1

可以使用CSharpCodeProvider

或者你可以使用腳本語言和運行解釋器在您的應用程序 防爆IronRuby

+0

確實很有意思 - 不完全確定它是正確的解決方案,除非可能生成剩餘的代碼並將其添加到編譯中 - 但是,我仍然擔心這個執行時間。但是,感謝您的鏈接! – 2012-01-09 12:39:49

+1

CSharpCodeProvider將非常​​快速,因爲編譯的成本只發生一次。 A-la IronRuby在加載後也應該沒問題,但它是一個完整的腳本環境+您可以在這些語言中獲得通常的腳本運行時。 – 2012-01-09 14:14:25

1

看一看,如果Roslyn可以幫助,但它仍然在CTP狀態。

+0

謝謝,我在某處列表的底部看到了這一點,但不確定是否適合做這項工作。我會看看是否是。 – 2012-01-09 12:38:02

+1

@AdamKDean:Roslyn將能夠幫助C#和VB腳本方案,但它尚未準備好黃金時段。 Bill在10月份發佈了一些關於我們計劃的初步文件:http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/06e3582e-386d-4a1c-964b-29529e497e72。如果你想評估它並向我們反饋你在這方面遇到的問題,請隨時留下對Bill的信息的反饋意見。謝謝! – 2012-01-09 14:48:29

+0

@EricLippert客人代碼(可編輯)需要能夠從主機代碼和函數調用方法/訪問變量,就像它是自己的類一樣。 如何將代碼編譯到庫中並動態加載它並調用通用方法?例如:http://pastebin.com/ATP6ri6R 如果我可以將代碼插入到模板中,然後編譯它並將其轉換爲Guest對象,那就太棒了。 可能嗎? – 2012-01-09 15:02:53

1

我認爲微軟的新編譯器項目就是你正在尋找的東西。有了它,你可以像腳本一樣運行C#。

Project "Roslyn"

+0

謝謝,我現在正在看一看。歡呼 – 2012-01-09 12:38:21

+1

並歡迎通過這種方式的計算器!如果你喜歡一個答案,你可以放棄它來給這個人信用(聲譽)。如果這是你的問題的答案,你也可以接受它作爲答案,讓其他人知道這是正確的答案,並給予答案聲望的人。 – SynerCoder 2012-01-09 14:17:24

+0

謝謝@SynerCoder,我一直是一個潛伏多年的人,stackoverflow已經挽救了我的皮膚很多次了,我已經失去了計數。就像所有的事情一樣,它輪到我加入社區並添加內容。感謝您的歡迎! – 2012-01-09 15:06:42

相關問題