26

最后有没有一种简单的方法可以从命令行执行 c# 脚本文件?

在github上看到了那个讨论

根据这个线程,我认为dotnet run Test.cs应该完成这项工作。

但是对于我的测试类,它是:

using System;
namespace Scripts
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.Out.WriteLine("This is the miracle");
        }
    }
}

它失败

PM> dotnet run .\Test.cs 
dotnet.exe : Object reference not set to an instance of an object.At line:1 char:1

那么如何以相对简单的方式使用命令行在单个文件中执行代码呢?


UPD 1:正如@Lee 和@svick 正确提到的,dotnet run用于运行项目。但我最初的问题是 - 如何运行单个文件。也许使用一些选项roslyn

4

5 回答 5

17

我在 Scott Hanselman 的博客上找到了另一个解决方案:

https://www.hanselman.com/blog/CAndNETCoreScriptingWithTheDotnetscriptGlobalTool.aspx

它依赖于一个名为 .NET CLI 的工具dotnet-script,您可以在下面找到它的存储库:

https://github.com/filipw/dotnet-script

要使用它,首先使用安装它dotnet tool install -g dotnet-script

然后您可以运行dotnet script并将其用作 REPL 或运行dotnet script file.csx以运行文件。

要包含 NuGet 包引用,请使用#r "nuget: AutoMapper, 6.1.0".

于 2019-05-06T11:58:34.470 回答
3

可以使用 Powershell 来完成。假设您的代码位于test.cs当前文件夹中的文件中:

$source = (Get-Content .\test.cs) -join " "
Add-Type $source -Language CSharp  
[Scripts.Program]::Main((""))

PS> .\test.ps1
This is the miracle

那么如何以相对简单的方式使用命令行在单个文件中执行代码呢?

将上面的代码包装成一个函数,将文件名作为参数,将该函数放在您的 Powershell 配置文件中,并在需要时运行它。但请注意,一旦您需要其他程序集,就必须在调用时指定它们。这是一个稍微详细一点的例子

于 2016-05-30T13:13:28.917 回答
2

为此,我一直使用这个 c# 脚本引擎:http ://csscript.net ,

非常容易实现并且运行良好,您可以引用本地 dll、Nuget 包或 GAC 程序集。

于 2018-05-25T14:32:52.863 回答
2

PowerShell 一个开箱即用的衬垫

(Add-Type -Path "Program.cs" -PassThru)::Main()

PS在您的特定情况下,该Main()方法具有args参数,它会抱怨它丢失了。在这种情况下调用Main($null)

于 2021-06-05T19:13:47.363 回答
1

很确定你需要一个 project.json 文件。这是一个让它运行的基本文件:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-*",
      "type": "platform"
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": {}
    }
  },

  "buildOptions": {
    "emitEntryPoint": true
  }
}

注意emitEntryPoint.

我不得不dotnet restore先然后dotnet run test.cs

于 2016-05-30T11:52:00.810 回答