2009-04-13 19 views
1

能夠在運行中創建JavaScript代碼非常酷。 這是通過使用字符串到方法

HtmlPage.Window.Eval("alert('Hello World')"); 

但是,有沒有辦法做同樣的事情,用C#方法?讓我們說一些像

void MethodEval("MessageBox.Show('Hello World')"); 

這是甚至可能的,而不必重新編譯你的代碼?

+0

這將是非常酷的 – user90052 2009-04-13 23:58:28

回答

1

你現在就可以做到。 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); 
1

這是可能的,但有點棘手,使用微軟的.NET框架。

C#編譯器是基本運行時的一部分,因此您可以編譯內存中的程序集並在其中執行代碼。

這是描述基本過程的good MSDN blog post

我已經使用過這個爲C#項目製作腳本引擎。用一點工作來包裝這個,你可以很容易地使用它。我曾參與過的一個開源項目有一個項目致力於:Pluto.Scripting

我們在該項目中有示例和測試,顯示C#,VB.NET和Boo的動態編譯和執行。

+0

所以基本上你需要有C#編譯器?在基於Web的應用程序上如何? – Fredrick 2009-04-14 00:10:42

+0

@Fredrick:C#編譯器是框架的一部分。它總是存在,如果你可以運行IL。不過,在網絡應用程序中,我會非常小心的使用它,因爲它可能導致允許錯誤代碼被輕鬆注入。 – 2009-04-14 00:24:06

+0

@Reed,實際上在asp.net應用程序中,如果您正在使用Web站點項目(與Web項目相關),那麼您可以免費獲得該項目。在App_Code中的所有代碼都是動態編譯的......並不是我推薦的。 – 2009-04-14 02:30:13

3

可能使用其他人發佈的技巧。 但是,這通常是一個非常糟糕的主意。

.Net代碼通常運行在比JavaScript瀏覽器沙箱更可信的上下文環境中,並且可以訪問更加豐富的,因此具有潛在破壞性的api。

而是使用System.Addin命名空間爲擴展,插件等提供非常嚴格的接口。如果您只是想使用更「流暢」的或功能豐富的編程環境,您可以使用lamdba表達式和閉包等有趣功能在內部傳遞功能。

0

其實我一直得到一個錯誤「意外縮進」這樣改變代碼

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); 

工作!有趣......謝謝

0

爲什麼你需要這個功能?你的代碼是否應該知道它的路徑幷包含這個邏輯?如果你不能預見這種用例 - 那麼也許不需要它。唯一真正的好處是它有被濫用和攻擊的機會。這聽起來像是你直接創造了一個利用潛力 - 這是一個恥辱,因爲像Java/CLR這樣的管理運行時不允許代碼注入,但是你將所有的善舉帶回...