代码之家  ›  专栏  ›  技术社区  ›  antivaxxer

为什么“新控制台”生成的项目不能用“构建”编译?(错误CS5001)

  •  0
  • antivaxxer  · 技术社区  · 12 月前

    首先,摘录一小段 from 微软:

    从开始。NET 6,新C#控制台应用程序的项目模板在Program.cs文件中生成以下代码:

    // See https://aka.ms/new-console-template for more information
    Console.WriteLine("Hello, World!");
    

    新的输出使用了最新的C#功能,简化了为程序编写所需的代码。

    . . . 当您使用较新版本时,您只需要编写Main方法的主体。编译器生成一个带有入口点方法的Program类,并将所有顶级语句放入该方法中。生成的方法的名称不是Main,它是一个代码不能直接引用的实现细节。您不需要包含其他程序元素,编译器会为您生成它们。


    有。NET SDK 8已安装,我打开命令提示符并键入:

    dotnet new console --output "D:\User Files\A_L_L\DOWNLOAD_TEMP\test"
    

    它创建了项目文件,其中之一是Program.cs。此文件的内容与上述(在Microsoft文章中)完全相同。

    问题是,我无法构建这个项目。当我打字时

    dotnet build "D:\User Files\A_L_L\DOWNLOAD_TEMP\test\test.csproj" --artifacts-path "D:\User Files\A_L_L\DOWNLOAD_TEMP\test"
    

    产生以下错误:

    error CS5001: Program does not contain a static 'Main' method suitable for an entry point
    

    所以…看起来像是新的程序风格,由 new console, 无法编译,因为 build 命令需要旧的程序样式( Main 入口点)。

    这是怎么回事?如何成功编译项目?

    谢谢

    2 回复  |  直到 12 月前
        1
  •  0
  •   Ben Hutchison    12 月前

    设置 --artifacts-path 由于某种原因,访问项目目录会中断构建;使用时,它通常意味着被设置为祖父母的子目录,例如 D:\User Files\A_L_L\DOWNLOAD_TEMP\artifacts .

    然而 bin obj 默认情况下,子目录已进入项目目录,因此您应该能够运行

    dotnet build "D:\User Files\A_L_L\DOWNLOAD_TEMP\test\test.csproj"
    

    这将建立 D:\User Files\A_L_L\DOWNLOAD_TEMP\test\bin\Debug\net8.0\test.exe 。它们不会进入你当前的工作目录或任何东西。

        2
  •  0
  •   Sweeper    12 月前

    它不期待老式 Main 方法入口点。它似乎根本找不到任何要编译的源文件。即使我写了一个正确的 Main 方法,或者当我犯下明显的编译器错误时,比如编写 Consol 而不是 Console .

    根据我的实验,似乎只有当你使用当前目录或其父目录之一作为工件路径时,它的行为才会如此。如果使用另一个目录作为工件路径,则可以构建项目。例如

    dotnet build XXX.csproj --artifacts-path SomeSubdirectory
    

    请注意,默认工件路径已经是项目目录。如果要显式指定它,请使用 -p 这个选项似乎总是有效的。

    dotnet build XXX.csproj -p ArtifactsPath=.
    

    这个 可以 与松散相关 this issue .

    推荐文章