从C#程序集内执行JavaScript

问题描述 投票:20回答:6

我想在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#单元测试一起报告成功/失败,并将其用作是否构建的指标坏了。

c# .net javascript unit-testing codedom
6个回答
1
投票

您可以使用JSUnit服务器从Nant内部运行JSUnit,它是用Java编写的,并且没有Nant任务,但是您可以从命令提示符下运行它,结果将记录为XML,您可以将它们与您的集成在一起建立报告流程。这不是您Nunit结果的一部分,而是一份额外报告。如果其中任何一项测试失败,我们将使构建失败。我们正是使用CC.Net来做到这一点。


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

2
投票

您可以将Microsoft Javascript引擎用于evaluating JavaScript code from C#

更新:自VS 2008起已过时


0
投票

我现在不知道任何.NET特定的方法来执行此操作...嗯,仍然有JScript.NET,但这可能与您需要执行的任何JS不兼容:)

显然,将来将会是DLR的.NET JScript实现,它将……有一天(希望如此)。

这样可能就可以运行旧的ActiveX JScript引擎了,当然可以从.NET做到这一点(我以前做过,尽管有点丑陋!)。


0
投票

如果您不是在浏览器的上下文中执行代码,为什么测试需要用Java脚本编写?很难理解您要在此处完成的工作的全局。


0
投票

使用JSUnit编写测试,然后使用WatiN会更简单吗?测试包装器以通过C#运行它们,基于JSUnit结果通过还是失败?

虽然确实是一个额外的步骤。

我相信我读过某个地方,即将发布的MBUnit或WatiN版本将内置处理JSUnit测试装置的功能。如果我能记得我在哪里读的...

© www.soinside.com 2019 - 2024. All rights reserved.