Выполнение JavaScript из сборки C#

Я хочу выполнить код JavaScript из сборки C# и вернуть результаты кода JavaScript в вызывающий код C#.

Легче определить вещи, которые я не пытаюсь сделать:

  • Я не пытаюсь вызвать функцию JavaScript на веб-странице из своего кода.

  • Я не пытаюсь загрузить элемент управления WebBrowser.

  • Я не хочу, чтобы JavaScript выполнял вызов AJAX на сервер.

Что я хочу сделать, так это написать модульные тесты на JavaScript, а затем модульные тесты выводят 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, которые написаны на JavaScript с использованием фреймворка JSUnit. Прямо сейчас, во время нашего процесса сборки, мы должны вручную загрузить веб-страницу и нажать кнопку, чтобы убедиться, что все модульные тесты JavaScript пройдены. Я хотел бы иметь возможность выполнять тесты во время процесса после сборки, когда запускаются наши автоматические модульные тесты С#, и сообщать об успехе/неуспехе вместе с нашими модульными тестами С# и использовать их в качестве индикатора того, является ли сборка или нет сломано.


person ScottKoon    schedule 15.09.2008    source источник
comment
Это такой позор, что реализация Javascript для DLR была заброшена, я думаю, она называлась JScriptX, иначе это была бы хорошая чистая интеграция вместе с динамическими функциями С# 4.0.   -  person    schedule 12.09.2010


Ответы (6)


Вы можете запустить свой JSUnit изнутри Nant, используя сервер JSUnit, он написан на java, и нет задачи Nant, но вы можете запустить его из командной строки, результаты регистрируются в виде XML, и вы можете интегрировать их с вашим отчетом о сборке обработать. Это не будет частью вашего результата Nunit, а будет дополнительным отчетом. Мы проваливаем сборку, если какой-либо из этих тестов не проходит. Мы делаем именно это, используя CC.Net.

person user10917    schedule 16.09.2008

Код должен быть довольно понятным, поэтому я просто опубликую его.

<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);
    }
}
person scubabbl    schedule 15.09.2008
comment
Я думаю, что кто-то еще указал, что пространство имен Microsoft.VSA было помечено как устаревшее с VS2008/.NET 3.5... пока автор знает об этом и ориентируется на более раннюю версию, я думаю, это круто. Я должен указать, что я не проверял их дважды. :) - person Sean Hanley; 16.09.2008

Вы можете использовать механизм Microsoft Javascript для оценки кода JavaScript из C#.

Обновление: это устарело с VS 2008

person Gulzar Nazim    schedule 15.09.2008
comment
Пространство имен Microsoft.VSA и все его объекты помечены как устаревшие с версии VS 2008. - person ScottKoon; 16.09.2008
comment
@ScottKoon, @Gulzar: Итак, что нужно сделать вместо использования устаревшего кода? - person Daniel Daranas; 18.05.2011

Я не знаю какого-либо конкретного способа сделать это прямо сейчас для .NET... Ну, есть еще JScript.NET, но он, вероятно, не будет совместим с любым JS, который вам нужно выполнить :)

Очевидно, что будущее будет за реализацией .NET JScript для DLR, которая появится... когда-нибудь (надеюсь).

Так что, вероятно, останется запустить старый движок ActiveX JScript, который, безусловно, можно сделать из .NET (я делал это в прошлом, хотя это немного уродливо!).

person tomasr    schedule 15.09.2008

Если вы не выполняете код в контексте браузера, почему тесты должны быть написаны на Javascript? Трудно понять общую картину того, чего вы пытаетесь достичь здесь.

person Jon Galloway    schedule 15.09.2008

Может быть проще использовать JSUnit для написания тестов, а затем использовать WatiN тестовую оболочку для запуска их через C#, прохождение или сбой на основе результатов JSUnit?

Хотя это действительно дополнительный шаг.

Кажется, я где-то читал, что следующая версия MBUnit или WatiN будет иметь встроенную функциональность для обработки тестовых приборов JSUnit. Если бы я только мог вспомнить, где я это читал...

person Sam Wessel    schedule 15.09.2008
comment
Я думал об этом или об использовании Selenium для запуска тестов. Но это все же дополнительный шаг. - person ScottKoon; 16.09.2008
comment
Здесь есть пример кода, касающийся использования WatiN для запуска модульных тестов: adamesterline.com/2007/05/15/ - person Paul Shannon; 26.09.2008