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

如何在Azure DevOps流水线中为私有NuGet源添加代码混淆

在Azure DevOps流水线中构建带混淆的.NetStandard 2.0 NuGet包

问题背景

我创建了一个共享的.NetStandard2.0类库,核心代码如下:

namespace SharedLibrary
{
    public sealed class MySecrets
    {
        public string GetSecrets()
        {
            // Do some activity
            string mySecreteString = "XXXX";
            return mySecreteString;
        }
    }
}

同时编写了YAML流水线将类库的NuGet包推送到私有源,流水线配置如下:

trigger:
- main

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  major: '3'
  minor: '0'
  revision: $[counter(variables['minor'], 1)] # This will get reset every time minor gets bumped.
  nugetVersion: '$(major).$(minor).$(revision)'

steps:
- task: UseDotNet@2
  displayName: 'Use .NetCore SDK'
  inputs:
    packageType: sdk
    version: 3.x
- task: DotNetCoreCLI@2
  displayName: Restore Task
  inputs:
    command: restore
    projects: '**\*csproj'

- task: DotNetCoreCLI@2
  displayName: Build Taks
  inputs:
    command: build
    projects: '**/*csproj'
    arguments: '--configuration Release'

- task: DotNetCoreCLI@2
  inputs:
    command: 'pack'
    packagesToPack: 'SharedLibrary/SharedLibrary.csproj' 
    versioningScheme: 'byEnvVar'
    versionEnvVar:  'nugetVersion'
- task: DotNetCoreCLI@2
  inputs:
    command: 'push'
    packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg'
    nuGetFeedType: 'internal'
    publishVstsFeed: 'XXXXX-8335-4cbc-9c43-2db9ad7e4000'

由于DLL可被反编译,我参考Obfuscar文档添加了obfuscar.xml配置和构建后事件"$(Obfuscar)" obfuscar.xml,但添加后构建失败。需要解决如何在DevOps中实现混淆后成功构建,也可采用其他方式生成带混淆的NuGet包。

解决方案

方案一:修复Obfuscar在Azure DevOps流水线中的配置

  1. 确保Obfuscar包安装正确

    • 在类库项目中通过NuGet安装Obfuscar包,确保版本适配.NetStandard2.0。
    • 检查项目文件(.csproj)中是否包含Obfuscar的引用,以及构建后事件的路径是否正确。
  2. 调整流水线步骤,分离构建、混淆、打包流程
    原流水线中build后直接pack,混淆需要在构建完成后、打包前执行。修改后的流水线步骤如下:

    trigger:
    - main
    
    pool:
      vmImage: 'windows-latest'
    
    variables:
      solution: '**/*.sln'
      buildPlatform: 'Any CPU'
      buildConfiguration: 'Release'
      major: '3'
      minor: '0'
      revision: $[counter(variables['minor'], 1)]
      nugetVersion: '$(major).$(minor).$(revision)'
      # 定义Obfuscar工具路径
      obfuscarPath: '$(Build.SourcesDirectory)/packages/Obfuscar.*/tools/Obfuscar.Console.exe'
    
    steps:
    - task: UseDotNet@2
      displayName: 'Use .NetCore SDK'
      inputs:
        packageType: sdk
        version: 3.x
    
    - task: DotNetCoreCLI@2
      displayName: Restore Dependencies
      inputs:
        command: restore
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: Build Project
      inputs:
        command: build
        projects: '**/*.csproj'
        arguments: '--configuration $(buildConfiguration) --no-restore'
    
    # 新增Obfuscar混淆步骤
    - task: PowerShell@2
      displayName: Run Obfuscar
      inputs:
        targetType: 'inline'
        script: |
          # 查找Obfuscar控制台工具路径
          $obfuscarExe = Get-ChildItem -Path $(obfuscarPath) -Recurse | Select-Object -First 1
          if (-not $obfuscarExe) {
              throw "Obfuscar Console not found!"
          }
          # 执行混淆
          & $obfuscarExe.FullName "$(Build.SourcesDirectory)/SharedLibrary/obfuscar.xml"
    
    - task: DotNetCoreCLI@2
      displayName: Pack NuGet Package
      inputs:
        command: 'pack'
        packagesToPack: 'SharedLibrary/SharedLibrary.csproj' 
        versioningScheme: 'byEnvVar'
        versionEnvVar: 'nugetVersion'
        arguments: '--no-build' # 避免重新构建覆盖混淆后的DLL
    
    - task: DotNetCoreCLI@2
      displayName: Push NuGet Package
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: 'XXXXX-8335-4cbc-9c43-2db9ad7e4000'
    
  3. 配置obfuscar.xml文件
    确保配置文件正确指向构建后的DLL和输出路径,示例配置:

    <?xml version="1.0"?>
    <Obfuscator>
      <Var name="InPath" value="$(Build.SourcesDirectory)/SharedLibrary/bin/$(buildConfiguration)/netstandard2.0" />
      <Var name="OutPath" value="$(Build.SourcesDirectory)/SharedLibrary/bin/$(buildConfiguration)/netstandard2.0/Obfuscated" />
      <Module file="$(InPath)/SharedLibrary.dll" />
      <!-- 保留公开类和方法,避免调用方无法访问 -->
      <KeepPublicApi />
    </Obfuscator>
    

    注意:需要保留类库对外暴露的API,否则其他项目引用NuGet包时会无法找到对应类型。

方案二:使用其他混淆工具(如ConfuserEx)

如果Obfuscar配置仍有问题,可以尝试ConfuserEx:

  1. 在流水线中添加ConfuserEx工具
    通过PowerShell脚本下载或引用ConfuserEx工具,在构建后执行混淆。
  2. 调整流水线步骤
    类似Obfuscar的流程,在构建后执行混淆,再基于混淆后的DLL打包NuGet。

关键注意事项

  • 保留公开API:混淆时必须保留类库对外暴露的类、方法和属性,否则引用该NuGet包的项目会编译失败。
  • 避免重复构建:打包步骤需添加--no-build参数,确保使用混淆后的DLL生成NuGet包。
  • 路径配置:确保流水线中工具路径、DLL路径和配置文件路径正确,避免因路径问题导致构建失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:54:29