2

我们有一个包含大约 150 个项目的视觉工作室解决方案。其中 5 个是可执行文件,另外 95 个是可执行文件引用的库或测试项目等。

我们的自动化 CI 通过 MSBuild 为 x86 和 x64 构建解决方案。但是,由于库总是构建 Any CPU,因此应该可以构建完整的解决方案 Any CPU,然后为每个平台再次构建可执行文件。

在 Visual Studio 中,我在配置管理器中有 3 个解决方案平台,x86/x64 平台仅构建 5 个可执行文件。在 VS 中,如果我先构建 Any CPU,然后我可以构建其他平台。

但是,我无法让这个构建从 msbuild 工作。构建 Any CPU 后,我构建了 x86,它无法解析项目引用。也就是说,/reference:库二进制文件的参数没有传递到 csc.exe,因此 csc 失败,因为它找不到二进制文件所依赖的任何类型。

如何让它与 MSBuild 一起使用?Visual Studio 如何知道在 bin\Any CPU 中查找,但 MSBuild 不知道?

4

1 回答 1

0

构建 Any CPU 后,我构建了 x86,它无法解析项目引用。也就是说,库二进制文件的 /reference: 参数没有传递到 csc.exe,因此 csc 失败,因为它找不到二进制文件所依赖的任何类型。

我无法重现此问题。每次如果CoreCompile目标执行,它会将引用的 projectName.dll 传递给我机器中的 csc.exe。为此,请确保您使用这种格式的引用来引用项目 dll:

   <ProjectReference Include="..\ClassLibraryOne\ClassLibraryOne.csproj">
      <Project>{xxx}</Project>
      <Name>ClassLibraryOne</Name>
    </ProjectReference>

并确保您没有Condition="'$(Platform)' == 'AnyCPU'"向 ProjectReference 元素添加条件。

Visual Studio 如何知道在 bin\Any CPU 中查找,但 MSBuild 不知道?

这是因为配置管理器。假设我有这样的配置设置:

在此处输入图像描述

我在解决方案中有一个可执行文件和两个库项目。可执行文件取决于这两个库。

1.在vs中,当我用switch boxset as构建解决方案时Any CPU,它实际上用platform构建了三个项目Any CPU

2.在vs中,当我用switch boxset as构建解决方案时x86,它实际上用platform构建了两个库项目Any CPU,并用x86平台构建了可执行文件。

3.当我在 msbuild 命令行中使用 Any CPU 构建解决方案时,它的工作方式与 #1 相同。

4.当我构建executable projectwith 时x86,它实际上构建了三个项目都在 x86 平台上。这是VS和命令行之间的最大区别。

对于差异,您应该知道 VS 中的开关框代表Solution Platform 而不是 Project Platform. 所以在 VS 中,当我将开关框设置为 x86 时,它知道对于 x86 解决方案平台,它应该Any CPUX86.

但是,当您在命令行中构建项目时,例如:msbuild xx.csproj /p:xxx=x86. 它只指定项目平台x86。而且由于 msbuild 可以发现这个项目依赖于两个库项目,它也会在 x86 中构建库项目。(有关解决方案配置和平台的信息存储在 xx.sln 文件中,而不是任何 xx,csproj 文件中

如何让它与 MSBuild 一起使用?

因为它在您第一次构建解决方案 Any CPU 然后在五个项目 X86 时在 VS 中工作。我认为您可以修改配置管理器。对于您的要求,您应该确保解决方案平台和项目平台之间的关系是:

1.
For solution: Debug Any CPU
For Library projects: Debug Any CPU
For executable projects: Debug Any CPU

2.
For solution: Debug x86
For Library projects: Debug Any CPU
For executable projects: Debug x86

3.
For solution: Debug x64
For Library projects: Debug Any CPU
For executable projects: Debug x64

不要忘记检查发布模式中的设置。那么我认为它会满足您的需求:as the libraries are always built Any CPU, it should be possible to build the full solution Any CPU, and then build the executables again for each platform.. 您应该始终使用解决方案文件而不是项目文件进行构建:

msbuild xx.sln /p:Platform="Any CPU" ...
msbuild xx.sln /p:Platform=x86 ...
msbuild xx.sln /p:Platform=x64 ...

因为任何 CPU 平台的库将在您首次使用 Any CPU 构建时构建。在第二次和第三次时,msbuild 只会编译和构建每个平台的可执行项目。它将再次跳过构建库以节省时间。

在此处输入图像描述

希望对您有所帮助,如果我有任何误解,请随时纠正我:)

于 2019-09-02T07:24:30.157 回答