【问题标题】:MSBuild looks for Main when building a projectMSBuild 在构建项目时查找 Main
【发布时间】:2020-02-22 13:43:02
【问题描述】:

我正在处理一个包含多个可执行文件的大型项目。我想通过一次构建所有这些来自动化部署过程。这就是我使用msbuild 命令行实用程序的原因。

当我在 Visual Studio 中构建我的一个项目时,它会正常构建。当我尝试使用 msbuild cmd 执行相同操作时,它会失败并出现错误

CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [pathToLibrary.csproj]

这是cmd代码:

msbuild MainProject.csproj -property:Configuration=Release -property:Platform="AnyCPU" -property:OutputType="WinExe" -target:"Rebuild"

pathToLibrary.csproj 确实是一个库,所以我不知道为什么msbuild 试图找到一个主要方法。空无一人。这是一个图书馆。

我在这里错过了什么?

【问题讨论】:

  • “没有。它是一个图书馆。” - 那么输出类型不应该设置为WinExe。这就是问题所在,我强烈怀疑。为什么要在命令行上指定它?
  • MainProject.csproj 包含对 pathToLibrary.csproj 库的引用。 MainProject 不会触发错误,但 pathToLibrary.csproj 会触发错误。请原谅我的命名约定不好:)
  • 也就是说,我正在构建MainProject,它恰好引用了一个库。 Main 方法丢失错误是针对库的,而不是针对 MainProject。
  • 看起来 WinExe OutputType 也被应用于 library.csproj。不仅适用于 MainProject.csproj
  • 为什么要在命令行中指定呢?当然,项目应该知道要产生什么类型的输出,这就是它在 VS 中所做的。你有没有试过不在命令行指定它?

标签: c# visual-studio msbuild


【解决方案1】:

pathToLibrary.csproj 确实是一个库,所以我不知道为什么要使用 msbuild 正在试图找到一个主要的方法。空无一人。这是一个图书馆。

当您的主项目通过Add Reference-->Projects 引用项目时,它总是不仅会构建主项目,还会同时构建被引用的项目。因此,当您通过 MSBuild 命令行构建该项目时,-property:OutputType=winexe 也将应用于这些引用的项目。当您在 VS IDE 和 MSBuild 中构建项目时,您将在输出日志中看到这些信息。

如果没有办法指示 msbuild 只覆盖 OutputType 对于 main .csproj,必须单独编辑每个文件

如果您只是想找到一种方法将-property:OutputType=winexe指定给主项目而不是MSBuild命令行引用的项目,我认为没有这样的功能。

或者你可以试试我的建议

1)请去掉MSBuild命令行中的-property:OutputType=winexe,在创建相关项目时已经指定了项目的输出类型,所以不需要在MSBuild 不是 MSBuild 的工作。

注意您可以像<OutputType>WinExe</OutputType>一样直接修改xxx.csproj中的属性。

2) 如果您在使用 MSBuild 命令行构建项目时仍然需要此功能,我建议您可以创建一个名为 Directory.Build.targets 的脚本,该脚本可以覆盖 OutputType 属性然后构建该项目与 MSBuild 分开。

~a)请在存在xxxx.csproj 文件的每个项目文件夹中创建一个名为Directory.Build.targets 的文件。

~b)在里面写下项目的相关属性:(在控制台项目中使用Exe,在windows中使用WinExe项目并在类库项目中使用 Library。)

 <Project>
    <Target Name="inputproperty" BeforeTargets="AssignProjectConfiguration">
    <PropertyGroup>
     <OutputType>WinExe</OutputType>
    </PropertyGroup>
    </Target>
    </Project>

在您的 MainProject 项目中这样写,然后在您的 pathToLibrary 项目中创建另一个 Directory.Build.targets 以使用 &lt;OutputType&gt;Library&lt;/OutputType&gt;,这样它就可以满足您的期望。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多