首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ScriptCS应用程序执行c#

从ScriptCS应用程序执行c#
EN

Stack Overflow用户
提问于 2014-12-05 19:46:02
回答 3查看 3.5K关注 0票数 7

背景

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

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

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

值返回给C#应用程序。

代码语言:javascript
复制
0 - Success
1 - Warning
2 - Error

当我第一次接受这个任务时,我认为这是MEF的一项工作,但是在不需要创建一个项目或编译任何东西的情况下创建这些“状态检查”会更加方便,仅仅在文件夹中规划一个scriptcs脚本就更有吸引力了。

所以我的问题是

  1. 是否有任何文档/示例一起使用c#应用程序和脚本(谷歌并没有给我太多的网络)?
  2. 这是scriptcs的用例,还是根本不打算像这样使用?
  3. 我是否会更容易地使用roslyn创建自定义解决方案,或者使用一些动态编译/执行?(我对剧本几乎没有经验)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-31 09:03:32

我找到了一些关于如何做到这一点的简单例子:

从磁盘上的文件中加载脚本并运行它:https://github.com/glennblock/scriptcs-hosting-example

一个可以提交代码的网站,它将返回结果:https://github.com/filipw/sample-scriptcs-webhost

下面是如何加载脚本文件、运行脚本文件并返回结果的示例:

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2014-12-05 21:03:38

问题2:只要对脚本语言有一点了解,脚本语言在这种情况下就能很好地工作。

问题3:就我个人而言,我会使用CS-脚本 --它维护得很好,而且它有很多文档。

票数 2
EN

Stack Overflow用户

发布于 2014-12-21 15:42:07

问题1.我做了一个(丑陋的)示例集成测试,用ScriptCS ()从C#执行System.Diagnostics.Process.Start() (在本例中涉及Powershell )--我不应该回答您希望的第一个问题。

代码语言:javascript
复制
    [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做了一件类似的事情,也许值得一看。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27323524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档