scriptcs hosting - 优于Roslyn的优势

Dam*_*ian 24 roslyn scriptcs

如果我想支持脚本在我的应用程序,确实scriptcs只是用普通的香草在提供任何特别的优势罗斯林脚本引擎?

khe*_*ang 25

不幸的是,关于托管脚本的文档还不多,但我会尽量给你一个简短的总结.

在您的应用程序中托管脚本提供了一些香草Roslyn不具备的功能:

可插拔发动机

虽然脚本默认配有Roslyn和Mono引擎,但您可以轻松地将其替换为其他引擎,即F#,LOLcode甚至Brainfuck.

前处理

scriptcs将处理您的脚本并提取诸如references(#r)之类的内容并加载其他脚本(#load).最近还推出了自定义ILineProcessors,它允许您挂入管道进行自定义处理.示例处理器可能如下所示:

public class GistLineProcessor : DirectiveLineProcessor
{
    protected string DirectiveName
    {
        return "gist";
    }

    protected override bool ProcessLine(IFileParser parser, FileParserContext context, string line)
    {
        var gistId = GetDirectiveArgument(line);

        var gistContents = DownloadGistContents(gistId);

        parser.ParseScript(gistContents, context);

        return true;
    }

    private static string DownloadGistContents(string gistId)
    {
        // Download gist contents...
    }
}
Run Code Online (Sandbox Code Playgroud)

该处理器将下载一个要点并将其作为脚本的一部分执行,即#gist 12345678.

NuGet集成

scriptcs与NuGet集成.这意味着如果您希望脚本能够使用NuGet包,只需安装它们,它们就会自动从packages文件夹中加载.

脚本包

脚本包是脚本的删除样板代码的方法.他们可以通过导入命名空间,引用程序集和向脚本公开功能Require<T>().请参阅Martin Doms关于构建scriptcs脚本包的优秀博客文章.有关可用脚本包的完整列表,请参阅脚本包主列表.

REPL

您可能知道,scriptcs有一个REPL.这可以在您自己的应用程序中重用,以提供交互式脚本会话.

调试

使用vanilla Roslyn脚本引擎,您无法轻松地调试脚本.scriptcs使您能够通过#line在预处理期间插入的指令调试具有源映射的脚本.


我可能已经忘记了一些东西,但这些是选择脚本超过香草Roslyn的要点.说到实际托管,您有两种选择:

ScriptCs.Core

这是一个超轻量级库,包含scriptcs管道的核心组件.但是,它不包含IScriptEngine(实际执行代码的引擎)和IInstallationProvider(安装包的组件,即NuGet)的实现,它们存在于ScriptCs.HostingScriptCs.Engine.Roslyn中.如果使用此库,则必须自己完成所有组件的连接,还需要为引擎和软件包安装程序提供实现.

ScriptCs.Hosting

ScriptCs.Hosting是用于在应用程序中托管脚本的便利层.它在scriptcs.exe内部使用,并为您完成组件的所有连接(通过Autofac).它包含程序包安装程序的NuGet实现,默认情况下依赖于ScriptCs.Engine.Roslyn.这是托管脚本的首选方式,因为它提供了一个ScriptServicesBuilder轻松替换脚本的内部服务.有关示例用法,请参阅scriptcs的Program.cs.

这可能听起来令人困惑,所以如果您有疑问,请询问JabbR,GithubGoogle Group.

  • 这是一个使用scriptcs托管来执行一些代码的示例,通过POST到WebAPI并通过HTTP返回它的返回值.https://github.com/filipw/sample-scriptcs-webhost (5认同)
  • 谢谢你的回复.是否有任何在Program.cs之外托管的例子(那里的代码引入了额外的概念,比如模块,我试图不需要做太多的挖掘只是为了尝试一下)? (4认同)