7

背景

我正在创建运行一些状态检查的 ac# 应用程序(想想 nagios 样式检查)。

理想情况下,我希望这个 c# 应用程序查看特定目录,然后编译/执行其中的任何 scriptcs 脚本,然后根据结果采取行动(例如,发送电子邮件警报以获取失败的状态检查)。

我希望脚本返回一个整数或其他东西(例如),并且该整数将指示状态检查成功或失败的天气。

返回给 C# 应用程序的值。

0 - Success
1 - Warning
2 - Error

当第一次承担这个任务时,我认为这是 MEF 的工作,但是创建这些“状态检查”会更加方便,而无需创建项目或编译任何东西,只需在文件夹中放置一个 scriptcs 脚本似乎更有吸引力.

所以我的问题是

  1. 是否有任何关于一起使用 ac# app 和 scriptcs 的文档/示例(谷歌并没有给我带来很多好处)?

  2. 这是脚本的用例还是从未真正打算像这样使用?

  3. 使用 roslyn 或一些动态编译/执行创建自定义解决方案是否会更轻松?(我对脚本的经验很少)

4

4 回答 4

5

我找到了一些很好的简单例子来说明如何做到这一点:

从磁盘上的文件加载脚本并运行它: 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;
}
于 2016-01-31T09:03:32.420 回答
2

问题 2:脚本语言在这种情况下可以很好地工作,只要您对它们有所了解

问题 3:我个人使用CS-Script,它维护得很好,并且有很多关于它的文档

于 2014-12-05T21:03:38.027 回答
1

对不起,如果我跑题了,但这个问题激发了我的想象力,我想......

IMMO scriptcs 更像是它自己的脚本环境,有点像 NodeC 之类的东西……它不需要任何东西来提供开箱即用的脚本环境。但据我所见。不向 .net 应用程序提供托管 API。当然我可能是错的,这将是查看源代码的问题,因为从文档中我也找不到参考;

在我看来,您最好自己集成 Roslyn api。

编辑:我错了,ScriptCs scriptcs.hosting Nuget 包是入口点,我可以在这里看到 Glimpse 和MakeSharp是如何做到的;

但是有EdgeJs,开箱即用给你几乎你想要的,但脚本将是 NodeJs 上的 Javascripts,但它似乎不是你想要的。

如果您尝试直接从 Edge 加载 c# 脚本怎么办,它可以编译 python、F#、c#、csx 的...但它也可以从 Node env 而不是 .net 执行它(或者我错过了什么?)

无论如何...在我看来,您可以从 .Net 加载 Edge 再次从 Node 加载 Edge 并调用 .Net 脚本,该脚本又会再次将某些内容返回给 .Net。

感觉有点矫枉过正,但又如此孤立,值得一试。除了一些设置之外,没有太多需要编写的代码。

我在GitHub 上加载了实验。

于 2014-12-07T08:06:25.330 回答
1

问题 1. 我做了一个(丑陋的)示例集成测试,使用 System.Diagnostics.Process.Start() 从 C# 执行 ScriptCS(在这种情况下涉及 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);
            }
        }
    }

test-file.csx 仅包含Console.WriteLine("2");您案例的“错误”示例。

问题 3. 我用Shovel ScriptPack for ScriptCS 做了类似的事情,可能值得一试。

于 2014-12-21T15:42:07.960 回答