2009-04-13 71 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这样的管理运行时不允许代码注入,但是你将所有的善举带回...