MSBuild 不适用于构建服务器上的控制台应用程序

MSBuild not working for a console application on build server

我 运行 正在使用一组特定的参数设置 MSBuild,它没有找到入口点,但能够 运行 在 Visual Studio 中正常运行。

.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
      <TargetFramework>net472</TargetFramework>  
    <Platforms>AnyCPU;x86</Platforms>       
    <LangVersion>latest</LangVersion>     
  </PropertyGroup>

有一个程序main:

public static void Main()

... MSBuild 是 运行 如下,以生成控制台应用程序:

 "C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Current\Bin\MSBuild.exe" 
    ".\Project.csproj" 
    /p:OutputPath=C:\temp\outputpath 
    /property:Configuration=Release 
    /property:OutputType=exe 
    /p:PlatformTarget=x86

然而,在我们的构建服务器上,作为 git 运行ner,这会产生以下错误:

CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [... path to another .netstandard "class library" project referenced by the console app in the solution, not the console app itself]

请注意,错误不是指项目的主要应用程序,而是引用的库项目之一。

UPDATE/EDIT: 通过简单地向此控制台应用程序的 class 库 依赖项目添加带有空 public static void Main() {}Program.cs 即可解决此问题。这似乎是荒谬的,但这确实使问题消失了。问题是 - 为什么这是必要的?

如果在生成可执行文件的代码中找不到具有正确签名的静态 Main 方法,则会发生此错误。如果使用错误的大小写定义入口点函数 Main,例如小写的 main,也会发生这种情况。有关适用于 Main 方法的规则的信息,请参阅 Main () 和命令行参数。

你可能要定义一个class然后在里面插入一个main方法

这似乎是 MSBuild 与 VS 社区版 2019 一起构建的 net472 项目的一个怪癖,该项目引用了 2 x netstandard2.0 class 个库。

解决方案是在这 2 个 class 库中添加一个空入口点,这看起来很荒谬 - 但完全解决了问题:

class Program
{
    public static void Main() { }
}

似乎在输出控制台应用程序时(outputType:exe 而不是 outputType:winexe),这是必要的。

重申一下,已经进入实际控制台应用程序的入口点,但出于某种原因,这是在它引用的 class 库中是必需的。如果在座的哪位大佬能解释一下,那就太有意思了!

您正在命令行上设置 OutputType。在 MSBuild 中,命令行参数优先于项目文件中设置的任何属性(如果您检查构建日志,每当 MSBuild 遇到试图在项目文件中设置 属性 时,您应该会发现消息 The "OutputType" property is a global property, and cannot be modified. ).

命令行参数也被传递给作为传递依赖项构建的任何项目。因此 MSBuild 正在尝试将您的库项目构建为 exe 项目,从而引发对缺少入口点的抱怨。

您实际上不需要在命令行上指定输出类型,因为它已在控制台应用程序项目文件中指定。只需尝试将其删除。