从c#应用程序执行ScriptCS

时间:2014-12-05 19:46:02

标签: c# scriptcs

背景

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

我理想的是这个c#应用程序查看特定目录,只编译/执行其中的任何scriptcs脚本,并根据结果进行操作(例如,发送失败状态检查的电子邮件警报)。

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

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

0 - Success
1 - Warning
2 - Error

当我第一次执行此任务时,我认为这是MEF的工作,但是创建这些“状态检查”而不必创建项目或编译任何内容会非常方便,只需在文件夹中填充脚本块脚本方式更有吸引力。

所以我的问题是

  1. 是否有任何关于使用c#app和scriptcs的文档/示例(谷歌没有给我多少钱)?

  2. 这是脚本的一个用例还是它真的不打算像这样使用?

  3. 使用roslyn或某些动态编译/执行创建自定义解决方案会更容易吗? (我对scriptsc的经验很少)

4 个答案:

答案 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做了类似的事情,可能值得一试。