簡體   English   中英

從 C# 程序集中執行 JavaScript

[英]Execute JavaScript from within a C# assembly

我想從 C# 程序集中執行 JavaScript 代碼,並將 JavaScript 代碼的結果返回給調用 JavaScript 代碼。

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

  • 我不是想從我的代碼后面的 web 頁面上調用 JavaScript function 頁面。

  • 我不想加載 WebBrowser 控件。

  • 我不想讓 JavaScript 對服務器執行 AJAX 調用。

我想做的是在 JavaScript 中編寫單元測試,然后對 output JSON 進行單元測試,即使是純文本也可以。 然后我想要一個通用的 C# 類/可執行文件,它可以加載包含 JS 的文件,運行 JS 單元測試,廢棄/加載結果,並在構建后任務期間返回帶有詳細信息的通過/失敗。

我認為使用舊的 ActiveX ScriptControl 是可能的,但似乎應該有一種 .NET 方式來做到這一點,而不使用 SilverLight、DLR 或其他任何尚未發貨的東西。 有人有想法么?

更新:來自布拉德艾布拉姆斯的博客

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")]

澄清:我們對 JavaScript 使用 JSUnit 框架編寫的 JavaScript 函數進行了單元測試。 現在在我們的構建過程中,我們必須手動加載 web 頁面並單擊按鈕以確保所有 JavaScript 單元測試通過。 我希望能夠在我們的自動化 C# 單元測試運行並在 C# 單元測試旁邊報告成功/失敗時在構建后過程中執行測試,並將它們用作是否構建的指標被打破。

代碼應該是非常自我解釋的,所以我將發布它。

<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 Javascript 引擎來評估 C# 中的 JavaScript 代碼

更新:這在 VS 2008 中已過時

您可以使用 JSUnit 服務器從 Nant 內部運行 JSUnit,它是用 java 編寫的,沒有 Nant 任務,但您可以從命令提示符運行它,結果記錄為 XML,您可以將它們與構建報告集成過程。 這不是 Nunit 結果的一部分,而是額外的報告。 如果其中任何一個測試失敗,我們就會使構建失敗。 我們正在使用 CC.Net 來做這件事。

使用JSUnit編寫測試,然后使用WatiN測試包裝器通過 C# 運行它們,根據 JSUnit 結果通過或失敗是否會更簡單?

雖然這確實是一個額外的步驟。

我相信我在某處讀到,即將發布的 MBUnit 或 WatiN 版本將內置處理 JSUnit 測試裝置的功能。 如果我能記得我在哪里讀到的……

我現在不知道有任何 .NET 特定的方式來執行此操作......嗯,仍然有 JScript.NET,但這可能與您需要執行的任何 JS 都不兼容:)

顯然,未來將是用於 DLR 的 .NET JScript 實現……總有一天(希望如此)。

所以這可能會留下運行舊的 ActiveX JScript 引擎,這當然可以從 .NET 這樣做(我過去做過,雖然它有點丑陋。)。

如果您不在瀏覽器上下文中執行代碼,為什么需要在 Javascript 中編寫測試? 很難理解你在這里想要完成的事情的大局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM