scriptcs hosting - 优于Roslyn的优势

时间:2013-08-23 15:04:26

标签: roslyn scriptcs

如果我想在我的应用程序中支持脚本,那么scriptcs是否比使用普通的Roslyn脚本引擎提供了任何特别的优势?

1 个答案:

答案 0 :(得分:25)

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

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

可插拔引擎

虽然默认情况下Scriptcs附带了Roslyn和Mono引擎,但您可以轻松地将其替换为其他引擎,即F#LOLcode甚至Brainfuck

预处理

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

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...
    }
}

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

NuGet集成

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

脚本包

脚本包是脚本的删除样板代码的方法。他们可以通过Require<T>()导入名称空间,引用程序集以及向脚本公开功能。请参阅Martin Doms关于building a scriptcs script pack的优秀博文。有关可用脚本包的完整列表,请参阅Script packs master list

REPL

你可能知道,scriptcs has a REPL。这可以在您自己的应用程序中重用,以提供交互式脚本会话。

调试

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


我可能已经忘记了一些东西,但这些是选择脚本而不是香草Roslyn的要点。对于实际主机,您有两种选择:

ScriptCs.Core

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

ScriptCs.Hosting

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

这听起来有点令人困惑,所以如果您有疑问,请在JabbRGithubGoogle Group上提问。