如果我想在我的应用程序中支持脚本,脚本比仅仅使用普通的罗斯林脚本引擎有什么特殊的优势吗?
发布于 2013-08-26 10:47:32
不幸的是,关于托管scriptcs的文档还不多,但是我将尝试给您一个简短的总结。
在您的应用程序中托管scriptcs提供了香草Roslyn没有的几个特性:
可堵塞发动机
虽然scriptcs默认带有Roslyn和Mono引擎,但您可以轻松地用另一个引擎替换它,即F#、LOLcode甚至布莱福克。
前处理
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并作为脚本(即#gist 12345678 )的一部分执行它。
NuGet集成
scriptcs与NuGet集成。这意味着,如果您希望脚本能够使用NuGet包,只需安装它们,它们将自动从 packages 文件夹中加载。
脚本包
脚本包是scriptcs删除样板代码的方法。它们可以通过Require<T>()导入命名空间、引用程序集和向脚本公开功能。请参阅Martin关于构建scriptcs脚本包的优秀博客文章。有关可用脚本包的全面列表,请参见脚本包主列表。
REPL
你可能知道,scriptcs有一个REPL。这可以在您自己的应用程序中重用,以提供交互式脚本会话。
调试
使用香草Roslyn脚本引擎,您不能很容易地调试脚本。scriptcs使您能够通过在预处理过程中插入的#line指令来调试具有源映射的脚本。
我可能忘了一些东西,但这是选择脚本而不是香草罗斯林的要点。当涉及到实际托管时,您有两个选项:
ScriptCs.Core
这是一个超级轻量级库,包含scriptcs管道的核心组件。但是,它不包含IScriptEngine (实际执行代码的引擎)和IInstallationProvider (安装包的组件,即NuGet)的实现,它们位于ScriptCs.Engine.Roslyn.和IScriptEngine中。如果您使用这个库,您将不得不自己完成组件的所有连接,并且您还需要为引擎和包安装程序提供一个实现。
ScriptCs.Hosting
ScriptCs.Hosting是在应用程序中托管scriptcs的一个方便层。它在scriptcs.exe内部使用,并为您完成组件的所有连接(通过Autofac)。它包含包安装程序的NuGet实现,默认情况下它依赖于NuGet。这是托管scriptcs的首选方式,因为它提供了一个ScriptServicesBuilder来轻松地替换scriptcs的内部服务。例如,请参见scriptcs Program.cs的用法。
https://stackoverflow.com/questions/18406109
复制相似问题