构建 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 box
set as构建解决方案时Any CPU
,它实际上用platform构建了三个项目Any CPU
。
2.在vs中,当我用switch box
set as构建解决方案时x86
,它实际上用platform构建了两个库项目Any CPU
,并用x86平台构建了可执行文件。
3.当我在 msbuild 命令行中使用 Any CPU 构建解决方案时,它的工作方式与 #1 相同。
4.当我构建executable project
with 时x86
,它实际上构建了三个项目都在 x86 平台上。这是VS和命令行之间的最大区别。
对于差异,您应该知道 VS 中的开关框代表Solution Platform
而不是 Project Platform
. 所以在 VS 中,当我将开关框设置为 x86 时,它知道对于 x86 解决方案平台,它应该Any CPU
在X86
.
但是,当您在命令行中构建项目时,例如: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 只会编译和构建每个平台的可执行项目。它将再次跳过构建库以节省时间。
希望对您有所帮助,如果我有任何误解,请随时纠正我:)