Azure Pipeline构建多目标项目时#if指令失效引发编译错误
问题
我有一个同时面向net472和netstandard2.0的多目标项目,包含条件包引用和#if NET472包裹的条件代码。本地及通过MSBuild编译解决方案均无错误,但在Azure Pipeline使用MSBuild任务编译时,出现CS0246错误:找不到#if NET472指令包裹的RiskUiProvider类。
项目的<TargetFrameworks>设置为net472;netstandard2.0,测试项目目标框架为net472,且已在ProjectReference中添加<AdditionalProperties>TargetFramework=net472</AdditionalProperties>,但Azure Pipeline仍无法识别该条件编译指令。
相关配置代码
Azure Pipeline YAML配置
- task: MSBuild@1 displayName: 'Build solution All.sln' inputs: solution: All.sln msbuildArchitecture: x64 platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory) /p:AutoGenerateBindingRedirects=true /p:GeneratePackageOnBuild=True /p:GenerateProjectSpecificOutputFolder=True /p:PackageOutputPath=$(Build.ArtifactStagingDirectory)\NuGet /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /target:Build ' clean: true - task: VSTest@3 displayName: 'Test Assemblies' inputs: testAssemblyVer2: | **\Project.UnitTests\Project.UnitTests.dll searchFolder: '$(Build.ArtifactStagingDirectory)\TU' testFiltercriteria: 'TestCategory=UnitTest & TestCategory!=Slow & TestCategory!=PerfNonRegTest' runInParallel: false codeCoverageEnabled: false otherConsoleOptions: '/Platform:$(BuildPlatform) /Framework:.NETFramework,Version=v4.7.2' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' condition: and(succeeded(), eq(variables['DisableUnitTests'], 'false')) timeoutInMinutes: 30
测试项目csproj配置
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <ProjectGuid>{48F901E6-F500-477A-B03C-4B6B2E8E362C}</ProjectGuid> <TargetFramework>net472</TargetFramework> <SccProjectName></SccProjectName> <SccLocalPath></SccLocalPath> <SccAuxPath></SccAuxPath> <SccProvider></SccProvider> <AssemblyTitle>LtCore.Tests</AssemblyTitle> <Product>LtCore.Tests</Product> <OutputPath>bin\$(Configuration)\</OutputPath> <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch> <ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugType>full</DebugType> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> </PropertyGroup> <ItemGroup> <PackageReference Include="log4net" Version="2.0.15" /> <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.8" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="NFluent" Version="2.8.0" /> <PackageReference Include="NSubstitute" Version="4.4.0" /> <PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="System.Text.Json" Version="8.0.5" /> </ItemGroup> <ItemGroup> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Net.Http" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\..\src\Project.Standard\Project.Standard.csproj"> <AdditionalProperties>TargetFramework=net472</AdditionalProperties> </ProjectReference> </ItemGroup> <ItemGroup> <Content Include="log4net.config"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
解决方案
以下是经过验证的解决方法:
强制指定编译目标框架
在MSBuild任务的msbuildArguments中添加/p:TargetFramework=net472,避免Azure Pipeline默认编译所有目标框架导致测试项目引用错误版本:msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory) /p:AutoGenerateBindingRedirects=true /p:GeneratePackageOnBuild=True /p:GenerateProjectSpecificOutputFolder=True /p:PackageOutputPath=$(Build.ArtifactStagingDirectory)\NuGet /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg /p:TargetFramework=net472 /target:Build '拆分编译步骤
若需要保留多目标包生成,可拆分编译流程:- 先单独编译多目标项目生成所有框架的包
- 再编译测试项目,确保其引用正确的
net472版本输出:- task: MSBuild@1 displayName: 'Build multi-target project' inputs: solution: src/Project.Standard/Project.Standard.csproj msbuildArchitecture: x64 platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory) /p:GeneratePackageOnBuild=True /p:PackageOutputPath=$(Build.ArtifactStagingDirectory)\NuGet /p:IncludeSymbols=true /p:SymbolPackageFormat=snupkg' clean: true - task: MSBuild@1 displayName: 'Build test project' inputs: solution: tests/Project.UnitTests/Project.UnitTests.csproj msbuildArchitecture: x64 platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory)/TU /p:AutoGenerateBindingRedirects=true' clean: false
修正项目引用格式
检查测试项目ProjectReference中的AdditionalProperties是否存在格式问题(比如多余缩进),确保代码格式规范:<ProjectReference Include="..\..\src\Project.Standard\Project.Standard.csproj"> <AdditionalProperties>TargetFramework=net472</AdditionalProperties> </ProjectReference>升级MSBuild版本
在MSBuild任务中指定使用最新版本的MSBuild,规避旧版本的框架识别bug:- task: MSBuild@1 displayName: 'Build solution All.sln' inputs: solution: All.sln msbuildVersion: 'latest' msbuildArchitecture: x64 # 其他参数保持不变
内容的提问来源于stack exchange,提问作者rahma sayadi
相关产品推荐
相关产品推荐

