迁移至.NET 8后Azure CI/CD未生成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

