从C#程序集中执行JavaScript

时间:2020-03-05 18:54:45  来源:igfitidea点击:

我想从Cassembly中执行JavaScript代码,并将JavaScript代码的结果返回给调用Ccode。

定义我不想做的事情会更容易:

  • 我不是想从后面的代码中调用网页上的JavaScript函数。
  • 我不是要加载WebBrowser控件。
  • 我不想让JavaScript对服务器执行AJAX调用。

我想做的是用JavaScript编写单元测试,然后让单元测试输出JSON,即使纯文本也可以。然后,我想要一个通用的Cclass /可执行文件,它可以加载包含JS的文件,运行JS单元测试,取消/加载结果,并在构建后任务期间返回通过/失败的详细信息。

我认为可以使用旧的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函数的单元测试。现在,在构建过程中,我们必须手动加载网页并单击一个按钮,以确保所有JavaScript单元测试都能通过。我希望能够在构建后的过程中运行我们的自动化Cunit测试并执行测试,并与Cunit测试一起报告成功/失败,并将它们用作构建是否被破坏的指标。

解决方案

回答

我们可以使用Microsoft Javascript引擎来评估来自C#的JavaScript代码

更新:自VS 2008起已过时

回答

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

确实,这确实是一个额外的步骤。

我相信我在某处读到,即将推出的MBUnit或者WatiN版本将内置处理JSUnit测试装置的功能。如果我能记得在哪里读到的...

回答

我现在不知道任何.NET特定的方式来执行此操作...好吧,仍然还有JScript.NET,但是那可能与我们需要执行的任何JS都不兼容:)

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

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

回答

该代码应该是很自我解释的,因此我将其发布。

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

    }

回答

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

回答

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