在 C# 程序集中执行 JavaScript
Posted
技术标签:
【中文标题】在 C# 程序集中执行 JavaScript【英文标题】:Execute JavaScript from within a C# assembly 【发布时间】:2010-09-09 05:24:11 【问题描述】:我想从 C# 程序集中执行 javascript 代码,并将 JavaScript 代码的结果返回给调用 C# 代码。
更容易定义我不想做的事情:
我不想从我的代码后面调用网页上的 JavaScript 函数。
我没有尝试加载 WebBrowser 控件。
我不想让 JavaScript 对服务器执行 AJAX 调用。
我想做的是用 JavaScript 编写单元测试,然后单元测试输出 JSON,即使是纯文本也可以。然后我想要一个通用的 C# 类/可执行文件,它可以加载包含 JS 的文件、运行 JS 单元测试、废弃/加载结果,并在构建后任务期间返回带有详细信息的通过/失败。
我认为使用旧的 ActiveX ScriptControl 是可能的,但似乎应该有一种 .NET 方式来做到这一点,而无需使用 SilverLight、DLR 或其他任何尚未发布的东西。有人有什么想法吗?
更新:From Brad Abrams blog
namespace Microsoft.JScript.Vsa
[Obsolete("There is no replacement for this feature. " +
"Please see the ICodeCompiler documentation for additional help. " +
"http://go.microsoft.com/fwlink/?linkid=14202")]
澄清: 我们对使用 JSUnit 框架用 JavaScript 编写的 JavaScript 函数进行了单元测试。现在,在我们的构建过程中,我们必须手动加载一个网页并单击一个按钮以确保所有 JavaScript 单元测试都通过。我希望能够在我们的自动化 C# 单元测试运行时在构建后过程中执行测试,并在 C# 单元测试旁边报告成功/失败,并将它们用作是否构建的指标坏了。
【问题讨论】:
很遗憾,DLR 的 Javascript 实现被放弃了,我相信它被称为 JScriptX,或者这将是与 c# 4.0 动态特性的一个很好的干净集成。 【参考方案1】:代码应该很容易解释,所以我将其发布。
<add assembly="Microsoft.Vsa, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies>
using Microsoft.JScript;
public class MyClass
public static Microsoft.JScript.Vsa.VsaEngine Engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
public static object EvaluateScript(string script)
object Result = null;
try
Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
catch (Exception ex)
return ex.Message;
return Result;
public void MyMethod()
string myscript = ...;
object myresult = EvaluateScript(myscript);
【讨论】:
我认为其他人已经指出 Microsoft.VSA 命名空间在 VS2008/.NET 3.5 时已被标记为过时...只要作者意识到这一点并针对早期版本我想这很酷。不过,我应该指出我没有仔细检查它们。 :)【参考方案2】:evaluating JavaScript code from C# 可以使用 Microsoft Javascript 引擎
更新:自 VS 2008 起已过时
【讨论】:
Microsoft.VSA 命名空间及其所有对象已被标记为自 VS 2008 起已过时。 @ScottKoon, @Gulzar:那么,应该怎么做而不是使用过时的代码呢?【参考方案3】:您可以使用 JSUnit 服务器从 Nant 内部运行您的 JSUnit,它是用 java 编写的,没有 Nant 任务,但您可以从命令提示符运行它,结果记录为 XML,您可以将它们与您的构建报告过程。 这不是 Nunit 结果的一部分,而是额外的报告。 如果其中任何一个测试失败,我们就会使构建失败。 我们正在使用 CC.Net 来做这件事。
【讨论】:
【参考方案4】:我现在不知道有任何特定于 .NET 的方式来执行此操作...嗯,仍然存在 JScript.NET,但它可能与您需要执行的任何 JS 都不兼容 :)
很明显,未来将是用于 DLR 的 .NET JScript 实现……总有一天(希望如此)。
所以这可能会留下运行旧的 ActiveX JScript 引擎,这当然可以从 .NET 中执行(我过去曾这样做过,虽然它有点丑陋!)。
【讨论】:
【参考方案5】:如果您不是在浏览器上下文中执行代码,为什么需要用 Javascript 编写测试?很难理解您在这里要完成的工作的大局。
【讨论】:
【参考方案6】:使用JSUnit 编写测试是否更简单,然后使用WatiN 测试包装器以通过 C# 运行它们,根据 JSUnit 结果通过还是失败?
这确实是一个额外的步骤。
我相信我在某处读到过,即将发布的 MBUnit 或 WatiN 版本将内置处理 JSUnit 测试装置的功能。如果我能记得我在哪里读到的……
【讨论】:
我已经考虑过或者使用 Selenium 来运行测试。但这仍然是一个额外的步骤。 这里有一些关于使用 WatiN 运行单元测试的示例代码:adamesterline.com/2007/05/15/…以上是关于在 C# 程序集中执行 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章
c# 中的类和构造函数在不同程序集中的 c# 中的默认访问说明符是啥 [重复]
C#:如何在尝试从另一个程序集中使用设置变量之前确保它存在?