从命令行运行单个*.cs脚本

sil*_*der 10 .net c# roslyn .net-core dotnet-cli

最后是一种从命令行执行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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它失败

PM> dotnet run .\Test.cs 
dotnet.exe : Object reference not set to an instance of an object.At line:1 char:1
Run Code Online (Sandbox Code Playgroud)

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


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

Tom*_*uer 15

我在 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".


Ale*_*lex 13

PowerShell 一内衬开箱即用

(Add-Type -Path "Program.cs" -PassThru)::Main()
Run Code Online (Sandbox Code Playgroud)

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


Jen*_*nsG 5

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

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

给出

PS> .\test.ps1
This is the miracle
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,使用 `-join " "` 会将程序的全部内容放在一行上。如果程序包含注释“//”,则程序的其余部分将被注释掉。为了避免这种情况,请使用 ``-join "`r`n"`` 代替。 (3认同)
  • @benrwb 或者您可以使用“Get-Content -raw”,它不会首先将内容分割成行。 (2认同)

Lee*_*unn 1

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

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

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

  "buildOptions": {
    "emitEntryPoint": true
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意emitEntryPoint.

我必须dotnet restore先,然后dotnet run test.cs