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

迁移至.NET 8后Azure CI/CD未生成SNI.dll的问题咨询

解决Azure DevOps CI构建.NET 8项目时缺失SNI.dll的问题

问题核心

将.NET 6的API/类库迁移到.NET 8后,Azure CI构建不再生成包含sni.dll的x64/x86文件夹,导致依赖的.NET Framework MVC项目启动时出现Failed to Load d:\test\SNI.dll错误;本地VS 2022(Any CPU配置)可正常生成这些文件,但Azure CI的MSBUILD@1任务在保留Any CPU配置时无法生成。

解决方案

1. 调整MSBuild参数,强制生成特定架构的原生依赖

在Azure CI的MSBUILD@1任务中添加RuntimeIdentifier和CopyLocalLockFileAssemblies参数,无需修改项目的Any CPU配置:

- task: MSBuild@1
  inputs:
    solution: '**/*.sln'
    msbuildArguments: '/p:Platform="Any CPU" /p:RuntimeIdentifier=win-x64 /p:SelfContained=false /p:CopyLocalLockFileAssemblies=true'
  • RuntimeIdentifier=win-x64:指定目标运行时架构,触发原生依赖(如SNI.dll)的复制
  • SelfContained=false:保持依赖框架部署模式,避免生成完整的自包含发布包
  • CopyLocalLockFileAssemblies=true:强制将所有NuGet依赖(包括原生运行时文件)复制到输出目录

如果需要同时生成x86版本,可添加额外的MSBuild任务指定RuntimeIdentifier=win-x86,或通过条件任务分别构建两种架构。

2. 在项目文件中显式配置SNI依赖复制

编辑.NET 8项目的.csproj文件,添加以下配置,确保SNI的原生运行时包被复制到输出目录:

<PropertyGroup>
  <!-- 强制复制所有NuGet依赖文件 -->
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

<ItemGroup>
  <!-- 显式引入SNI运行时包,版本需与项目使用的Microsoft.Data.SqlClient版本匹配 -->
  <PackageReference Include="Microsoft.Data.SqlClient.SNI.runtime" Version="5.1.0" PrivateAssets="all" />
</ItemGroup>

添加后,MSBuild会自动将对应架构的sni.dll复制到输出目录的runtimes/win-x64/native路径下,可在CI后续任务中将该文件移动到项目预期的x64文件夹中:

Move-Item -Path "$(Build.ArtifactStagingDirectory)\runtimes\win-x64\native\sni.dll" -Destination "$(Build.ArtifactStagingDirectory)\x64\" -Force

3. 手动复制SNI.dll到输出目录

如果上述方法无效,可在CI管道中添加PowerShell任务,直接从.NET 8 SDK目录复制sni.dll:

# 确保CI代理已安装.NET 8 SDK,若未安装可先添加UseDotNet任务
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.x'

# 复制x64架构的SNI.dll
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $sniPath = (Get-ChildItem "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.*\win-x64\sni.dll" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).FullName
      New-Item -Path "$(Build.ArtifactStagingDirectory)\x64" -ItemType Directory -Force
      Copy-Item -Path $sniPath -Destination "$(Build.ArtifactStagingDirectory)\x64\" -Force

原因说明

.NET 8在依赖框架部署模式下,默认不会自动复制特定架构的原生依赖文件(如SNI.dll);而本地VS 2022在调试或构建时,会根据开发环境自动处理这些原生依赖的复制逻辑。Azure CI的MSBuild任务默认未触发该逻辑,需通过显式参数或配置强制生成相关文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:42:10