khe*_*ang 25
不幸的是,关于托管脚本的文档还不多,但我会尽量给你一个简短的总结.
在您的应用程序中托管脚本提供了一些香草Roslyn不具备的功能:
虽然脚本默认配有Roslyn和Mono引擎,但您可以轻松地将其替换为其他引擎,即F#,LOLcode甚至Brainfuck.
scriptcs将处理您的脚本并提取诸如references(#r
)之类的内容并加载其他脚本(#load
).最近还推出了自定义ILineProcessor
s,它允许您挂入管道进行自定义处理.示例处理器可能如下所示:
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
.
scriptcs与NuGet集成.这意味着如果您希望脚本能够使用NuGet包,只需安装它们,它们就会自动从packages文件夹中加载.
脚本包是脚本的删除样板代码的方法.他们可以通过导入命名空间,引用程序集和向脚本公开功能Require<T>()
.请参阅Martin Doms关于构建scriptcs脚本包的优秀博客文章.有关可用脚本包的完整列表,请参阅脚本包主列表.
您可能知道,scriptcs有一个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.
归档时间: |
|
查看次数: |
3157 次 |
最近记录: |