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 项目,从而引发对缺少入口点的抱怨。
您实际上不需要在命令行上指定输出类型,因为它已在控制台应用程序项目文件中指定。只需尝试将其删除。
我 运行 正在使用一组特定的参数设置 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 项目,从而引发对缺少入口点的抱怨。
您实际上不需要在命令行上指定输出类型,因为它已在控制台应用程序项目文件中指定。只需尝试将其删除。