背景
我正在创建一个运行一些状态检查(比如nagios样式检查)的c#应用程序。
理想情况下,我希望这个c#应用程序查看特定的目录,并在其中编译/执行任何scriptcs脚本,并对结果采取行动(例如,发送电子邮件警告以检查失败的状态)。
我希望脚本返回一个整数或其他东西(例如),该整数将指示状态检查是否成功或失败。
值返回给C#应用程序。
0 - Success
1 - Warning
2 - Error当我第一次接受这个任务时,我认为这是MEF的一项工作,但是在不需要创建一个项目或编译任何东西的情况下创建这些“状态检查”会更加方便,仅仅在文件夹中规划一个scriptcs脚本就更有吸引力了。
所以我的问题是
发布于 2016-01-31 09:03:32
我找到了一些关于如何做到这一点的简单例子:
从磁盘上的文件中加载脚本并运行它: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;
}发布于 2014-12-05 21:03:38
问题2:只要对脚本语言有一点了解,脚本语言在这种情况下就能很好地工作。
问题3:就我个人而言,我会使用CS-脚本 --它维护得很好,而且它有很多文档。
发布于 2014-12-21 15:42:07
问题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);
}
}
}case只包含Console.WriteLine("2");,作为您的情况下的“错误”示例。
问题3.我已经用铲式ScriptPack为ScriptCS做了一件类似的事情,也许值得一看。
https://stackoverflow.com/questions/27323524
复制相似问题