Azure DevOps 构建无法加载引用的程序集

Azure DevOps build cannot load referenced assemblies

我有一个包含 400 个项目的 .Net 4.7.6 解决方案。其中一些项目正在引用本地 DLL,一些正在使用 nugets 包。

我们的 VS 上的一切都在构建良好,我们的构建机器(使用 MSBuild)上的一切都构建良好,但是一旦我们将所有内容推送到 Azure DevOps 上,我们就会有一堆引用的 DLL(不是全部)负载:

来自包的一个示例是 Log4Net:

##[warning]C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2084,5): Warning MSB3246: Resolved file has a bad image, no metadata, or is otherwise inaccessible. Could not load file or assembly 'log4net.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format.

(显然,它失败了,因为找不到它:)

##[error]Src\External\NModbus\Modbus\Device\ModbusMasterTcpConnection.cs(20,7): Error CS0246: The type or namespace name 'log4net' could not be found (are you missing a using directive or an assembly reference?)

某些本地 DLL 的相同错误:

##[warning]C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2084,5): Warning MSB3246: Resolved file has a bad image, no metadata, or is otherwise inaccessible. Could not load file or assembly 'Unme.Common.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format.
 ##[error]Src\External\NModbus\Modbus\Data\DataStore.cs(16,7): Error CS0246: The type or namespace name 'Unme' could not be found (are you missing a using directive or an assembly reference?)

不确定我错过了什么?我们整个团队的 VS Studio 和 Azure 之间的可加载 DLL 有什么不同?

这是我们当前的构建定义:

# .NET Desktop
# Build and run tests for .NET Desktop or Windows classic desktop solutions.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: 'Solution/SomeSolution.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:

- task: NuGetToolInstaller@1
  inputs:
    versionSpec: '>=5.4'
    checkLatest: true

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: Assembly-Info-NetFramework@2
  inputs:
    Path: '$(Build.SourcesDirectory)'
    FileNames: |
      **\AssemblyInfo.cs
    InsertAttributes: false
    FileEncoding: 'auto'
    WriteBOM: false
    VersionNumber: '5.1.0.*'
    FileVersionNumber: '5.1.0.*'
    LogLevel: 'verbose'
    FailOnWarning: false   
    
- task: MSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildVersion: latest
    msbuildArchitecture: x86
    platform: 'Any CPU'
    configuration: 'Debug'
    maximumCpuCount: true


- task: VSTest@2
  inputs:
    DisableTelemetry: false
    testSelector: 'testAssemblies'
    testAssemblyVer2: '$(solution)'
    searchFolder: '$(System.DefaultWorkingDirectory)'
    codeCoverageEnabled: true
    platform: 'Any CPU'
    configuration: 'Debug'
    rerunFailedTests: false

有一天我被困在这个问题上,非常沮丧:'(

What could be different regarding the loadable DLL between our VS Studio of the whole team and azure?

当我们在 Azure devops 上处理本地 dll 文件时,我们需要将这些本地 dll 文件提交到 repo。

并且那些本地dll文件的项目文件中的HintPath应该是相对路径而不是绝对路径。

最后但同样重要的是,如果您通过 git lfs 将 dll 文件推送到存储库,在获取源代码步骤中有一个特定的复选框来启用 git-lfs 支持。没有它,文件将被替换为 lfs 下载位置的占位符:

更新:

we need to submit the those local dll files into the repo. what do you mean by that? All DLL are on our git(I mean, on a brand new computer with visual studio, I can checkout the code and build, no need to install anything else). Also, we use Azure Repository, so we don't have GUI steps, and I've no Get Sources step in the template that has been generated

我的意思是,如果我们将这些本地 dll 文件与 Azure 管道一起使用,我们需要将这些 dll 文件与我们的项目一起提交到 Azure devops 存储库。当我们创建构建管道时,我们将 select 构建源,然后 Azure devops 管道将构建源检出到构建代理:

代码源可以是Azure devops repoGithubGithub Enterprise serverBitucket cloud。如果您 select Azure devops 存储库作为代码源,我们需要提交这些 dll 文件并将其推送到 Azure devops 存储库。

接下来,当您打开构建管道 (YAML) 并单击三个垂直点时,select 触发器并切换到 YAML 选项卡,您将看到获取源: