【问题标题】:run single *.cs script from command line从命令行运行单个 *.cs 脚本
【发布时间】:2016-09-28 04:27:29
【问题描述】:

终于有一种简单的方法可以从命令行执行 c# 脚本文件了吗?

我看到了discussion on 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的选项?

【问题讨论】:

标签: c# .net roslyn .net-core dotnet-cli


【解决方案1】:

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

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

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

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"

【讨论】:

    【解决方案2】:

    可以使用 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 配置文件中,并在需要时运行它。但请注意,只要您需要其他程序集,就必须在调用时指定它们。 Here's a slightly more elaborat example.

    【讨论】:

    • 请注意,使用-join " " 会将程序的全部内容放在一行中。如果程序包含注释//,那么程序的其余部分将被注释掉。为避免这种情况,请改用-join "`r`n"
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      PowerShell 一列开箱即用

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

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

      【讨论】:

        【解决方案5】:

        很确定您需要一个 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

        【讨论】:

        • 所以这个选项只适用于项目并且不允许运行单个脚本,对吧?
        • 我想是的,但如果有人能证实那会很好。我注意到如果您执行“dotnet new”,它会创建两个文件。一个“Hello World”Program.cs 和一个简单的 project.json 文件。
        猜你喜欢
        • 2018-10-05
        • 2020-03-15
        • 2012-05-03
        • 2011-05-01
        • 2013-09-14
        • 2013-07-18
        • 1970-01-01
        相关资源
        最近更新 更多