我需要一个 CSharp 脚本 (.csx) 运行程序,例如 csi.exe,用于构建代理机器

I need a CSharp script (.csx) runner, like csi.exe, for a build agent machine

我正在编写 .csx 构建脚本。在我的本地机器上,我 运行 它们与来自 visual studio 或通过 C:\Program Files (x86)\MSBuild.0\bin\csi.exe 的 CSharp 交互。我已经在安装了 Microsoft Built Tools 2015 的 TeamCity 构建代理机器(代理机器执行编译等实际构建任务)上尝试了 运行ning .csx 脚本。令人惊讶的是,MSBuild 文件夹中没有 csi.exe

我正在寻找在我的构建代理机器上安装 csi.exe 或兼容的独立 .csx 运行ner 的方法。在 Google 中找到的选项,如 https://github.com/cake-build/cake ,似乎都有其独特的脚本风格或许多附加功能,而我正在理想地寻找 csi.exe 克隆。

您可以使用 Roslyn API.

使用您喜欢的任何自定义来编译您自己的运行器

此代码将完成 运行 脚本的基本工作:

static void Main(string[] args)
{
    Task<object> result = CSharpScript.EvaluateAsync(File.ReadAllText(args[0]));
    result.Wait();
}

结果证明解决方案很简单:Roslyn NuGet package 包含 csi.exe。 它将位于 packages\microsoft.net.compilers.2.4.0\tools\csi.exe.

需要注意一件事 - 软件包的安装脚本更改 .csproj 文件以使用软件包提供的编译器。这可能不是您想要的,因此如果在安装期间进行了此类更改,请确保回滚这些更改。

微软文档中有一个很好的教程: Cross-Platform Code Generation with Roslyn and .NET Core

它在某种程度上等同于使用 csi.exe,但有更多好处。

在他们的示例中,您有一个变量 const string code。这可以是您表单中的字符串或脚本文件的内容。

我自己更喜欢这种方法,因为:

  • 它允许你访问和控制你的 运行ner 的资源,正确地实例化它,测量它的性能等等。简单地 运行ning CSI 如果保持不变,可能会在内存中爆炸,并且比在代码中管理它更不透明。
  • 它returns 错误情况下的代码分析。您可以让用户轻松查明构建失败的来源。
  • 它是跨平台的,不像例如csi.exe 坐在某个硬盘上
  • 您可以选择在 运行 时编译,或者创建一个 运行 如果预先构建
  • 会快得多的 DLL

TeamCity 2021.2 提供了新的C# Script runner,希望是你所需要的