能夠在運行中創建JavaScript代碼非常酷。 這是通過使用字符串到方法
HtmlPage.Window.Eval("alert('Hello World')");
但是,有沒有辦法做同樣的事情,用C#方法?讓我們說一些像
void MethodEval("MessageBox.Show('Hello World')");
這是甚至可能的,而不必重新編譯你的代碼?
能夠在運行中創建JavaScript代碼非常酷。 這是通過使用字符串到方法
HtmlPage.Window.Eval("alert('Hello World')");
但是,有沒有辦法做同樣的事情,用C#方法?讓我們說一些像
void MethodEval("MessageBox.Show('Hello World')");
這是甚至可能的,而不必重新編譯你的代碼?
你現在就可以做到。 ag DLR (Silverlight Dynamic Languages Runtime)可以託管javascript。
雖然JavaScript不能在瀏覽器之外使用DLR託管Ruby和Python可以。下面是一個使用DLR的C#代碼片段的示例,並託管了一段Python代碼來演示。
using IronPython.Hosting;
PythonEngine pythonEngine = new PythonEngine();
string script = @"import clr
clr.AddReference(""System.Windows.Forms"")
import System.Windows.Forms as WinForms
WinForms.MessageBox.Show(""Hello"", ""Hello World"")";
pythonEngine.Execute(script);
這是可能的,但有點棘手,使用微軟的.NET框架。
C#編譯器是基本運行時的一部分,因此您可以編譯內存中的程序集並在其中執行代碼。
這是描述基本過程的good MSDN blog post。
我已經使用過這個爲C#項目製作腳本引擎。用一點工作來包裝這個,你可以很容易地使用它。我曾參與過的一個開源項目有一個項目致力於:Pluto.Scripting
我們在該項目中有示例和測試,顯示C#,VB.NET和Boo的動態編譯和執行。
所以基本上你需要有C#編譯器?在基於Web的應用程序上如何? – Fredrick 2009-04-14 00:10:42
@Fredrick:C#編譯器是框架的一部分。它總是存在,如果你可以運行IL。不過,在網絡應用程序中,我會非常小心的使用它,因爲它可能導致允許錯誤代碼被輕鬆注入。 – 2009-04-14 00:24:06
@Reed,實際上在asp.net應用程序中,如果您正在使用Web站點項目(與Web項目相關),那麼您可以免費獲得該項目。在App_Code中的所有代碼都是動態編譯的......並不是我推薦的。 – 2009-04-14 02:30:13
可能使用其他人發佈的技巧。 但是,這通常是一個非常糟糕的主意。
.Net代碼通常運行在比JavaScript瀏覽器沙箱更可信的上下文環境中,並且可以訪問更加豐富的,因此具有潛在破壞性的api。
而是使用System.Addin命名空間爲擴展,插件等提供非常嚴格的接口。如果您只是想使用更「流暢」的或功能豐富的編程環境,您可以使用lamdba表達式和閉包等有趣功能在內部傳遞功能。
如果您不介意Boo,您可以使用其interpreter。
其實我一直得到一個錯誤「意外縮進」這樣改變代碼
PythonEngine pythonEngine = new PythonEngine();
string script = @"import clr; clr.AddReference(""System.Windows"");";
script += @"import System.Windows as Wins;";
script += @"Wins.MessageBox.Show(""Hello World"");";
pythonEngine.Execute(script);
工作!有趣......謝謝
爲什麼你需要這個功能?你的代碼是否應該知道它的路徑幷包含這個邏輯?如果你不能預見這種用例 - 那麼也許不需要它。唯一真正的好處是它有被濫用和攻擊的機會。這聽起來像是你直接創造了一個利用潛力 - 這是一個恥辱,因爲像Java/CLR這樣的管理運行時不允許代碼注入,但是你將所有的善舉帶回...
這將是非常酷的 – user90052 2009-04-13 23:58:28