Выполнение JavaScript из сборки C#
-
09-06-2019 - |
Вопрос
Я хотел бы выполнить код 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 пройдены.Я хотел бы иметь возможность выполнять тесты во время процесса после сборки, когда запускаются наши автоматизированные модульные тесты C#, и сообщать об успехе/неуспехе вместе с модульными тестами C# и использовать их в качестве индикатора того, выполняется ли сборка. сломан.
Решение
Вы можете запустить JSUnit изнутри Nant, используя сервер JSUnit, он написан на Java, и нет задачи Nant, но вы можете запустить его из командной строки, результаты записываются в виде XML, и вы можете интегрировать их с отчетом о сборке. процесс.Это не будет частью вашего результата Nunit, а будет дополнительным отчетом.Мы провалим сборку, если какой-либо из этих тестов не пройден.Мы делаем именно это, используя CC.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);
}
}
Вы можете использовать движок Microsoft Javascript для оценка кода JavaScript из C#
Обновлять:Это устарело с VS 2008.
Я не знаю какого-либо конкретного способа .NET сделать это прямо сейчас...Ну, еще есть JScript.NET, но он, вероятно, не будет совместим с любым JS, который вам нужно выполнить :)
Очевидно, что будущее — это реализация .NET JScript для DLR, которая скоро появится…когда-нибудь (надеюсь).
Так что, вероятно, останется использовать старый движок ActiveX JScript, что, безусловно, возможно сделать из .NET (я делал это раньше, хотя это немного некрасиво!).
Если вы выполняете код не в контексте браузера, зачем тесты писать на Javascript?Трудно понять более широкую картину того, чего вы здесь пытаетесь достичь.
Может ли быть проще использовать JSUnit написать тесты, а затем использовать ВатиНтестовая оболочка для их запуска через C#, пройдена или нет в зависимости от результатов JSUnit?
Хотя это действительно дополнительный шаг.
Кажется, я где-то читал, что в следующей версии MBUnit или WatiN будет встроена функциональность для обработки тестовых приспособлений JSUnit.Если бы я мог вспомнить, где я это прочитал...