微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从c#应用程序执行ScriptCS

背景

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

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

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

值返回到C#应用程序.

0 - Success
1 - Warning
2 - Error

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

所以我的问题是

>是否有任何关于使用c#app和scriptcs的文档/示例(google并没有给我带来太多帮助)?
>这是脚本的用例还是它真的不打算像这样使用?
>使用roslyn或某些动态编译/执行创建自定义解决方案,我会更轻松吗? (我对scriptsc的经验很少)

解决方法

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

从磁盘上的文件加载脚本并运行它:
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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐