You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
解决方案

以下是经过验证的解决方法:

  1. 强制指定编译目标框架
    在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 '
    
  2. 拆分编译步骤
    若需要保留多目标包生成,可拆分编译流程:

    • 先单独编译多目标项目生成所有框架的包
    • 再编译测试项目,确保其引用正确的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
      
  3. 修正项目引用格式
    检查测试项目ProjectReference中的AdditionalProperties是否存在格式问题(比如多余缩进),确保代码格式规范:

    <ProjectReference Include="..\..\src\Project.Standard\Project.Standard.csproj">
      <AdditionalProperties>TargetFramework=net472</AdditionalProperties>
    </ProjectReference>
    
  4. 升级MSBuild版本
    在MSBuild任务中指定使用最新版本的MSBuild,规避旧版本的框架识别bug:

    - task: MSBuild@1
      displayName: 'Build solution All.sln'
      inputs:
        solution: All.sln
        msbuildVersion: 'latest'
        msbuildArchitecture: x64
        # 其他参数保持不变
    

内容的提问来源于stack exchange,提问作者rahma sayadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:17:05