背景
我正在创建一个运行一些状态检查的c#应用程序(想想nagios样式检查)。
我理想的是这个c#应用程序查看特定目录,只编译/执行其中的任何scriptcs脚本,并根据结果进行操作(例如,发送失败状态检查的电子邮件警报)。
我希望脚本返回一个整数或某个东西(例如),该整数表示状态检查成功或失败的天气。
返回给C#应用程序的值。
0 - Success
1 - Warning
2 - Error
当我第一次执行此任务时,我认为这是MEF的工作,但是创建这些“状态检查”而不必创建项目或编译任何内容会非常方便,只需在文件夹中填充脚本块脚本方式更有吸引力。
所以我的问题是
是否有任何关于使用c#app和scriptcs的文档/示例(谷歌没有给我多少钱)?
这是脚本的一个用例还是它真的不打算像这样使用?
使用roslyn或某些动态编译/执行创建自定义解决方案会更容易吗? (我对scriptsc的经验很少)
答案 0 :(得分:4)
我找到了一些关于如何做到这一点的简单例子:
从磁盘上的文件加载脚本并运行它: 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;
}
答案 1 :(得分:2)
问题2: 只要您对它们有所了解,脚本语言就可以在这种情况下正常运行
问题3: 个人ID使用CS-Script维护良好,并且有很多文档
答案 2 :(得分:1)
对不起,如果我偏离主题,但这个问题点燃了我的想象力, 我以为......
IMMO scriptcs更像是自己编写脚本的环境,有点像NodeCs那种东西......
它不需要任何东西来提供开箱即用的脚本环境。
但到目前为止,我可以看到。没有为.net应用程序提供托管API。
当然我可能是错的,这将是一个查看来源的问题,因为从文档我也找不到参考;
在我看来,你最好整合Roslyn api。
编辑:我错了,ScriptCs scriptcs.hosting Nuget包是入口点,我可以看到here Glimpse和MakeSharp是如何做到的;
但是有EdgeJs,开箱即用可以提供你想要的东西,但是脚本将是NodeJs上的Javascripts,但它似乎不是你想要的。
如果您尝试加载该怎么办? c#脚本直接来自Edge,它可以编译python,F#,c#,csx的...... 但它也是从Node env做的,而不是.net(或者我错过了什么?)
无论如何......我突然想到你可以从Node加载Edge .Net加载Edge并调用.Net脚本,然后再将某些内容返回给.Net。
这感觉就像是一种矫枉过正,但如此孤立,以至于值得一试。除了一些设置,它没有太多代码。
我在GitHub上加载了实验。
答案 3 :(得分:1)
问题1.我使用System.Diagnostics.Process.Start()(在这种情况下涉及Powershell)从C#执行了一个(丑陋)示例集成测试来执行ScriptCS 我不应该回答你的第一个问题。
[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);
}
}
}
test-file.csx仅包含Console.WriteLine("2");
作为&#34;错误&#34;例子就是你的情况。
问题3.我已经使用Shovel ScriptPack对ScriptCS做了类似的事情,可能值得一试。