gpt4 book ai didi

roslyn - scriptcs 托管 - 优于 Roslyn

转载 作者:行者123 更新时间:2023-12-03 11:00:53 27 4
gpt4 key购买 nike

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

最佳答案

不幸的是,目前还没有太多关于托管 scriptcs 的文档,但我会尽量给你一个简短的总结。

在您的应用程序中托管 scriptcs 提供了一些普通 Roslyn 没有的功能:

可插拔引擎

虽然 scriptcs 默认带有 Roslyn 和 Mono 引擎,但您可以轻松地将其替换为另一个引擎,即 F#LOLcode 甚至 Brainfuck

预处理

scriptcs 将处理您的脚本并提取诸如引用( #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...
}
}

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

NuGet 集成

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

脚本包

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

复制代码

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

调试

使用 vanilla Roslyn 脚本引擎,您不能很容易地调试脚本。 scriptcs 使您能够通过在预处理期间插入的 #line 指令使用源映射来调试脚本。

我可能忘记了一些东西,但这些是选择 scriptcs 而不是 vanilla Roslyn 的要点。在实际托管方面,您有两种选择:

ScriptCs.Core

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

ScriptCs.Hosting

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

这听起来可能令人困惑,因此如果您有任何疑问,请在 JabbRGithubGoogle Group 上提问。

关于roslyn - scriptcs 托管 - 优于 Roslyn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com