在C#程序集中执行JavaScript代码

20

我想从C#程序集中运行JavaScript代码,并将JavaScript代码的结果返回给调用C#代码。

更明确地说,我不是想在代码后台调用Web页面上的JavaScript函数;我也不想加载WebBrowser控件;我不想让JavaScript执行AJAX调用服务器。我想用JavaScript编写单元测试,并输出JSON或普通文本,然后有一个通用的C#类/可执行文件可以加载包含JS的文件,运行JS单元测试,将结果抓取/载入,并在post-build任务期间返回带有详细信息的通过/失败状态。我认为使用旧的ActiveX ScriptControl是可能的,但似乎应该有一种.NET的方式来做到这一点,而不使用SilverLight、DLR或任何尚未发布的东西。大家有什么想法吗?

更新:来自Brad Abrams博客

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单元测试都通过。我希望能够在自动化的C#单元测试运行期间,在后构建过程中执行这些测试,并将其成功/失败报告与C#单元测试一起显示,以便于判断构建是否出现问题。


很遗憾,DLR的Javascript实现被放弃了,我相信它被称为JScriptX,否则这将是一个很好的清洁集成,与c# 4.0动态特性一起使用。 - user53791
6个回答

7
代码应该相当自我解释,所以我将只发布它。
<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);
    }
}

3
我认为已经有人指出,Microsoft.VSA命名空间在VS2008/.NET 3.5之后已经标记为过时... 只要作者知道这一点并且针对的是早期版本,那就没问题。不过我应该指出,我没有再次核实这些信息。 :) - Sean Hanley

2

2
自VS 2008起,Microsoft.VSA命名空间及其所有对象均已标记为过时。 - ScottKoon
2
@ScottKoon,@Gulzar:那么,除了使用过时的代码之外,应该做些什么? - Daniel Daranas

1

你可以使用JSUnit服务器在Nant内运行JSUnit,它是用Java编写的,没有Nant任务,但你可以从命令提示符中运行它,结果以XML格式记录,你可以将它们与构建报告过程集成。 这不会成为你的Nunit结果的一部分,而是额外的报告。 如果其中任何一个测试失败,我们将构建失败。 我们正在使用CC.Net完全实现这一点。


0

使用JSUnit编写测试,然后使用WatiN测试包装器通过C#运行它们,根据JSUnit结果传递或失败,这样会更简单吗?

虽然确实需要额外的步骤。

我相信我在某个地方读到过,即将推出的MBUnit或WatiN版本将具有内置功能来处理JSUnit测试夹具。只是我记不起我在哪里读到的了...


我考虑过使用Selenium来运行测试。但这仍然是一个额外的步骤。 - ScottKoon
这里有一些关于使用WatiN运行单元测试的示例代码:http://adamesterline.com/2007/05/15/integrating-jsunit-with-nunit-using-watin/ - Paul Shannon

0

目前我不知道任何.NET特定的方法来做这件事...嗯,还有JScript.NET,但那可能不兼容你需要执行的JS :)

显然,未来是DLR的.NET JScript实现,它将会到来...希望是有一天。

所以这样就只剩下运行旧的ActiveX JScript引擎了,从.NET中进行这种操作当然是可行的(我之前也做过,但是它看起来有点丑陋!)。


0
如果您不在浏览器环境中执行代码,为什么测试需要用 Javascript 编写?很难理解您在尝试实现什么样的大局观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接