答案 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
。
scriptcs与NuGet集成。这意味着如果您希望脚本能够使用NuGet包,只需安装它们,它们就会自动从包文件夹中加载。
脚本包是脚本的删除样板代码的方法。他们可以通过Require<T>()
导入名称空间,引用程序集以及向脚本公开功能。请参阅Martin Doms关于building a scriptcs script pack的优秀博文。有关可用脚本包的完整列表,请参阅Script packs master list。
你可能知道,scriptcs has a REPL。这可以在您自己的应用程序中重用,以提供交互式脚本会话。
使用vanilla Roslyn脚本引擎,您无法轻松调试脚本。 scriptcs使您能够通过在预处理期间插入的#line
指令调试具有源映射的脚本。
我可能已经忘记了一些东西,但这些是选择脚本而不是香草Roslyn的要点。对于实际主机,您有两种选择:
这是一个超轻量级库,包含scriptcs管道的核心组件。但是,它不包含IScriptEngine
(实际执行代码的引擎)和IInstallationProvider
(安装包的组件,即NuGet)的实现,这些实现在 ScriptCs.Hosting 和 ScriptCs.Engine.Roslyn 。如果您使用此库,则必须自己完成组件的所有连接,并且还需要为引擎和软件包安装程序提供实现。
ScriptCs.Hosting是一个便利层,用于在应用程序中托管脚本。它在scriptcs.exe内部使用,并为您完成组件的所有连线(通过Autofac)。它包含程序包安装程序的NuGet实现,默认情况下依赖于 ScriptCs.Engine.Roslyn 。这是托管脚本的首选方式,因为它提供了ScriptServicesBuilder
来轻松替换脚本的内部服务。有关示例用法,请参阅scriptcs' Program.cs。
这听起来有点令人困惑,所以如果您有疑问,请在JabbR,Github或Google Group上提问。