2014-12-05 9 views
3

ФоновыеВыполнение ScriptCS из C# приложения

Я создаю C# приложение, которое запускает некоторые проверки состояния (думаю проверки Nagios стиля).

Что я в идеале хочу, это приложение C#, чтобы посмотреть конкретный каталог и просто скомпилировать/выполнить скрипты скриптов внутри него и действовать на результаты (например, отправлять оповещения по электронной почте о сбоях проверки статуса).

Я бы ожидал, что сценарий вернет целое число или что-то (например), и это целое будет указывать на погоду, когда проверка состояния прошла успешно или не удалась.

Значения возвращены к применению C#.

0 - Success 
1 - Warning 
2 - Error 

Когда первая задача с этим я подумал, что это работа для MEF, но было бы гораздо удобнее, чтобы создать эту «проверку состояния» без того, чтобы создать проект или компилировать что-нибудь, просто шлепаясь в scriptcs сценарий в папке кажется более привлекательным.

Так что мои вопросы

  1. Есть ли какие-либо документации/образцы на использование C# приложения и scriptcs вместе (Google не чистый меня много)?

  2. Является ли это прецедентом для скриптов или он никогда не предназначался для такого использования?

  3. Могу ли я упростить создание простого решения с помощью roslyn или какой-либо динамической компиляции/выполнения? (У меня очень мало опыта работы с scriptsc)

ответ

3

Я нашел несколько хороших простых примеров о том, как это сделать:

Загрузка скрипта из файла на диске и запустить его: https://github.com/glennblock/scriptcs-hosting-example

Веб-сайт, где вы можете отправить код, и он будет возвращает результат: https://github.com/filipw/sample-scriptcs-webhost

Вот пример того, как загрузить файл сценария, запустите его и возвращает результат:

public dynamic RunScript() 
{ 
    var logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    var scriptServicesBuilder = new ScriptServicesBuilder(new ScriptConsole(), logger). 
     LogLevel(LogLevel.Info).Cache(false).Repl(false).ScriptEngine<RoslynScriptEngine>(); 

    var scriptcs = scriptServicesBuilder.Build(); 

    scriptcs.Executor.Initialize(new[] { "System.Web" }, Enumerable.Empty<IScriptPack>()); 
    scriptcs.Executor.AddReferences(Assembly.GetExecutingAssembly()); 

    var result = scriptcs.Executor.Execute("HelloWorld.csx"); 

    scriptcs.Executor.Terminate(); 

    if (result.CompileExceptionInfo != null) 
     return new { error = result.CompileExceptionInfo.SourceException.Message }; 
    if (result.ExecuteExceptionInfo != null) 
     return new { error = result.ExecuteExceptionInfo.SourceException.Message }; 

    return result.ReturnValue; 
} 
2

Вопрос 2: Язык сценариев может хорошо работать в этой ситуации, пока вы понимаете, немного о них

Вопрос 3: Лично Id использовать CS-Script ИТС в хорошем состоянии, и есть много документации для него

1

Извините, если я иду немного не по теме, но вопрос зажигается мое воображение, и я подумал ...

IMMO scriptcs - это больше среда сценариев, сама по себе, немного похожая на NodeCs ... Не нужно ничего, чтобы дать среду сценариев из коробки. Но как я мог видеть. не обеспечивает управляемый api для приложения .net. Конечно, я могу ошибаться, и это будет вопрос поиска источника, потому что из документов я также не мог найти ссылку;

Мне кажется, что вам лучше интегрировать Roslyn api your self.

EDIT: Я был не прав, ScriptCs scriptcs.хостинг пакетов Nuget является точкой входа, и я вижу here, как Glimpse и MakeSharp сделали это;

Но есть EdgeJs, из коробки дает вам в значительной степени то, что вы хотите, но скрипты будут Javascripts на NodeJs, но, похоже, это не то, что вы хотите.

Что делать, если вы пытаетесь загрузить C# скриптов прямо с краю, он может скомпилировать питон, F #, C#, CSX-х ... Но его также делает его из узла окр, не .net (или я что-то пропустил?)

В любом случае ... мне пришло в голову, что вы можете загрузить Edge из .Net load Edge снова из Node и Call. NET-скрипта, который по очереди снова вернет что-то .Net.

Это похоже на излишний, но настолько красиво изолированный, что, возможно, стоит попробовать. и, кроме того, некоторые настройки не так много для его кодирования.

Я загрузил эксперимент на GitHub.

1

Вопрос 1. Я сделал (уродливый) пример интеграционного теста, выполняющего ScriptCS с C# с System.Diagnostics.Process.Start() (В этом случае задействует Powershell) Я должен ответить на ваш первый вопрос, на который я надеюсь.

[Test, Explicit] 
    public void RunScriptCsFile_FilePrintsTheValue2_StreamIsParsedCorrectly() { 
     var scriptFile = @"C:\Projects\test-project\test-project.Tests\test-file.csx"; 
     var param = string.Format("scriptcs {0}", scriptFile); 
     Process executeScript = new Process { 
      StartInfo = new ProcessStartInfo { 
       FileName = "powershell.exe", 
       Arguments = param, 
       UseShellExecute = false, 
       RedirectStandardOutput = true, 
       CreateNoWindow = true 
      } 
     }; 

     executeScript.Start(); 
     var value = -1; 
     while (!executeScript.StandardOutput.EndOfStream) { 
      string line = executeScript.StandardOutput.ReadLine(); 
      if (int.TryParse(line, out value)) { 
       Assert.AreEqual(2, value); 
      } 
     } 
    } 

Тест-file.csx содержит только Console.WriteLine("2"); В качестве примера «ошибка» для вашего случая.

Вопрос 3. Я сделал аналогичную вещь с Shovel ScriptPack для ScriptCS. Возможно, стоит проверить.

 Смежные вопросы

  • Нет связанных вопросов^_^