2012-10-18 24 views
2

是否可以將C#用作DSL,其中C#源代碼由最終用戶在TextBox中編輯,在應用程序運行時編譯,然後由已運行的應用程序調用?使用C#作爲我的DSL - 這是可能的,如果是這樣,怎麼辦?

我問,因爲在接下來的幾個月中,我將需要實現一個簡單的數學運算DSL(類似的財產以後雷切爾林的博客上講述在http://rachel53461.wordpress.com/2011/08/20/the-math-converter/ 我專注於她的代碼的數學處理方面,而不是XAML/Converter方面)。我會傾向於重複使用她的代碼,因爲我想添加if語句和其他可能的功能。如果我可以自己使用C#,那麼我可以獲得所有功能,而無需重新實現它們。

如果可以做到這一點,我想用什麼樣的框架或命名空間或類來實現這一目標?

請注意,我會用C#衍生的DSL做的一件事是使用頭語句硬編碼所有必需的,然後刪除由精明用戶輸入的所有使用語句。這樣做的目的是爲了減少最終用戶試圖將我的C#類DSL用於滿足其企業策略願望或不需要站點管理員知識的全面編譯器的前景。 我建議如何使用陳述來防止用戶惡作劇?

最後,如果到此爲止的所有答案都是「是」,那麼這種方法的缺點是什麼,尤其是引入安全漏洞的缺點?

保羅

+0

爲什麼不使用這個腳本語言? Python例如已經有了.NET支持。 –

+1

http://stackoverflow.com/questions/3188882/compile-and-run-dynamic-code-without-generating-exe – Chris

+0

@克里斯克里斯,它看起來像你的建議,http://stackoverflow.com/questions/3188882/compile-and-run-dynamic-code-without-generating-exe是我的問題的答案(至少是第一個)。但我不能接受它(今晚晚些時候),除非你讓它成爲答案。 – philologon

回答

1

使用指令不會幫助,除非你還可以找到一些方法來防止用戶例如寫刪除System.Diagnostics.Process.Start("evilprogram.exe")。這樣做(不阻止屬性訪問)將需要您使用C#解析器。

但是,您可能可以爲此使用代碼訪問安全性。

+0

你可以給我一點關於代碼訪問安全性的細節,所以我可以找到某個地方來閱讀它嗎?或者只是通過使用Google語句來彈出正確的鏈接? – philologon

4

我建議如何管理使用語句對用戶惡作劇的防禦?

不可以。您也必須刪除對完全限定類的引用。然後,用戶仍然可以使用反射訪問他們沒有以任何方式引用的類。

你會想要創建一個單獨的appdomain來包含用戶的代碼,然後你可以適當地沙箱。 Here is a relevant article on MSDN,這深入解釋了這個過程。

+0

謝謝Porges。它看起來像你答案中的鏈接將是我研究和實施的關鍵部分。 – philologon

+0

如果這個想法起作用了,那麼反射是安全的,因爲他不能添加'使用System.Reflection'(但這個想法不起作用)。 – erikkallen

+0

@erikkallen:好點。但是,是完全不安全的,因爲如果他們真的想要,他們可以在內存中創建x86機器代碼。 – porges

相關問題