使用MSBuild通过dirs.proj编译时出现VerifyAlteredTargetsUsed不存在错误
.NET 4.7.2 多项目通过dirs.proj编译失败的原因及解决方法
在基于.NET 4.7.2的代码仓库中,单独编译每个项目均能成功,但通过dirs.proj同时编译两个项目时出现异常错误。以下是常见的问题原因及对应的解决办法:
1. 并行编译引发文件冲突
- 原因:MSBuild默认启用并行编译(多进程编译),如果两个项目的输出目录、中间文件目录存在重叠,或者编译过程中读写同一共享文件,会触发文件锁定、访问被拒绝类的错误。
- 解决方法:
- 为每个项目配置独立的输出/中间目录,修改项目文件(
.csproj)中的属性:<PropertyGroup> <OutputPath>bin\$(Configuration)\$(MSBuildProjectName)\</OutputPath> <IntermediateOutputPath>obj\$(Configuration)\$(MSBuildProjectName)\</IntermediateOutputPath> </PropertyGroup> - 在
dirs.proj中禁用并行编译,调整<MSBuild>任务参数:<MSBuild Projects="@(Projects)" BuildInParallel="false" Targets="Build" />
- 为每个项目配置独立的输出/中间目录,修改项目文件(
2. 项目依赖关系未明确
- 原因:若两个项目存在依赖(如项目A引用项目B的程序集),但
dirs.proj未指定正确的编译顺序,并行编译时会出现依赖项目未完成编译,主项目找不到依赖文件的情况。 - 解决方法:
- 在
dirs.proj的项目列表中,按依赖顺序排列项目(先写被依赖项目):<ItemGroup> <Projects Include="Path\To\ProjectB.csproj" /> <Projects Include="Path\To\ProjectA.csproj" /> </ItemGroup> - 在主项目中添加对依赖项目的
ProjectReference,让MSBuild自动识别并处理编译顺序:<ItemGroup> <ProjectReference Include="..\ProjectB\ProjectB.csproj" /> </ItemGroup>
- 在
3. dirs.proj配置存在语法或逻辑错误
- 原因:
dirs.proj的XML命名空间错误、项目路径匹配不准确、缺少必要的编译参数(如Configuration、Platform),都会导致编译流程异常。 - 解决方法:
- 规范
dirs.proj的基础配置,确保命名空间、任务参数正确:<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <!-- 匹配所有csproj,排除自身 --> <Projects Include="**\*.csproj" Exclude="$(MSBuildProjectFile)" /> </ItemGroup> <Target Name="Build"> <MSBuild Projects="@(Projects)" Targets="Build" Properties="Configuration=Debug;Platform=AnyCPU" /> </Target> </Project> - 检查项目路径是否正确,避免因相对路径错误导致找不到项目文件。
- 规范
内容的提问来源于stack exchange,提问作者run yang
相关产品推荐
相关产品推荐

