.NET Framework 4.8 Web Form应用Azure DevOps CI/CD未生成bin文件夹
.NET Framework 4.8 Web Form应用Azure DevOps部署后运行时缺失DLL问题
问题概述
- 基于.NET Framework 4.8的遗留Web Form应用,Azure DevOps构建、发布流水线运行成功且应用已部署,但加载时提示找不到所需DLL文件。
- Visual Studio本地构建时,项目bin文件夹可正常生成;但Azure DevOps执行构建/发布命令时未生成该文件夹。
- 已确认DLL对应的NuGet包通过
nuget restore命令完成还原,包源包含nuget.org和Azure集中式工件源。
流水线关键细节
构建任务
使用VS Build任务,核心参数包含DeployOnBuild=true、WebPublishMethod=Package、PackageAsSingleFile=true等,完整命令行参数见下方构建日志。
发布任务
- 采用虚拟机代理的部署组作业;
- 已配置复制命令将源目录文件复制到暂存目录;
- 通过文件共享发布工件。
构建日志(中文翻译)
构建开始于 2023/7/12 12:16:28 PM。 日志详细级别设置为:详细。 进程 = "H:\Program Files\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" MSBuild可执行文件路径 = "H:\Program Files\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" 命令行参数 = ""H:\Program Files\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" "C:\agents\_work\14\s\BPS.sln" /nologo /nr:false /fl /flp:"logfile=C:\agents\_work\14\s\BPS.sln.log;verbosity=detailed" /dl:CentralLogger,"C:\agents\_work\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda\1.151.2\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll";"RootDetailId=a04548bd-5502-4326-80b0-1a4339df8a85|SolutionDir=C:\agents\_work\14\s"*ForwardingLogger,"C:\agents\_work\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda\1.151.2\ps_modules\MSBuildHelpers\Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="C:\agents\_work\14\a\\" /p:platform="Any CPU" /p:configuration="Debug" /p:VisualStudioVersion="16.0" /p:_MSDeployUserAgent="TFS_7842cdc1-e646-44c6-9caa-e4fc5eaf2560_build_208_0"" 当前目录 = "C:\agents\_work\_tasks\VSBuild_71a9a2d3-a98a-4caa-96ab-affca411ecda\1.151.2" MSBuild版本 = "16.11.2+f32259642" BPS: 默认将.NET Framework v4.8映射到.NET Framework v4.0版本的aspnet_compiler.exe。如需更改使用的工具版本,请设置"ToolPath"参数指定工具的正确路径。 BPS: 默认将.NET Framework v4.8映射到.NET Framework v4.0版本的aspnet_compiler.exe。如需更改使用的工具版本,请设置"ToolPath"参数指定工具的正确路径。 项目 "C:\agents\_work\14\s\BPS.sln" 在节点1(默认目标)上构建。 使用工具版本"Current"构建。 目标"ValidateSolutionConfiguration"位于文件"C:\agents\_work\14\s\BPS.sln.metaproj",来自项目"C:\agents\_work\14\s\BPS.sln"(入口点): 任务"Error"跳过,因为条件不成立;(('$(CurrentSolutionConfigurationContents)' == '') and ('$(SkipInvalidConfigurations)' != 'true')) 计算结果为 (('<SolutionConfiguration> <ProjectConfiguration Project="{5FA4972F-7390-4264-B5EC-083A69B2FD82}" AbsolutePath="C:\agents\_work\14\s\http://localhost/BPS" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration> </SolutionConfiguration>' == '') and ('true' != 'true'))。 任务"Warning"跳过,因为条件不成立;(('$(CurrentSolutionConfigurationContents)' == '') and ('$(SkipInvalidConfigurations)' == 'true')) 计算结果为 (('<SolutionConfiguration> <ProjectConfiguration Project="{5FA4972F-7390-4264-B5EC-083A69B2FD82}" AbsolutePath="C:\agents\_work\14\s\http://localhost/BPS" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration> </SolutionConfiguration>' == '') and ('true' == 'true'))。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"Message"任务。 任务"Message" 正在生成解决方案配置"Debug|Any CPU"。 完成执行任务"Message"。 完成在项目"BPS.sln"中构建目标"ValidateSolutionConfiguration"。 目标"ValidateToolsVersions"位于文件"C:\agents\_work\14\s\BPS.sln.metaproj",来自项目"C:\agents\_work\14\s\BPS.sln"(入口点): 任务"Error"跳过,因为条件不成立;('$(MSBuildToolsVersion)' == '2.0' and ('$(ProjectToolsVersion)' != '2.0' and '$(ProjectToolsVersion)' != '')) 计算结果为 ('Current' == '2.0' and ('' != '2.0' and '' != ''))。 完成在项目"BPS.sln"中构建目标"ValidateToolsVersions"。 目标"ValidateProjects"位于文件"C:\agents\_work\14\s\BPS.sln.metaproj",来自项目"C:\agents\_work\14\s\BPS.sln"(入口点): 任务"Warning"跳过,因为条件不成立;( ('$(Configuration)' == 'Release') and ('$(Platform)' == 'Any CPU') ) 计算结果为 ( ('Debug' == 'Release') and ('Any CPU' == 'Any CPU') )。 完成在项目"BPS.sln"中构建目标"ValidateProjects"。 目标"Build"位于文件"C:\agents\_work\14\s\BPS.sln.metaproj",来自项目"C:\agents\_work\14\s\BPS.sln"(入口点): 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"MSBuild"任务。 任务"MSBuild" 全局属性: BuildingSolutionFile=true CurrentSolutionConfigurationContents=<SolutionConfiguration> <ProjectConfiguration Project="{5FA4972F-7390-4264-B5EC-083A69B2FD82}" AbsolutePath="C:\agents\_work\14\s\http://localhost/BPS" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration> </SolutionConfiguration> SolutionDir=C:\agents\_work\14\s\ SolutionExt=.sln SolutionFileName=BPS.sln SolutionName=BPS SolutionPath=C:\agents\_work\14\s\BPS.sln 项目"C:\agents\_work\14\s\BPS.metaproj"的附加属性: Configuration=Debug Platform=Any CPU 项目"C:\agents\_work\14\s\BPS.sln"(1)正在节点1(默认目标)上构建"C:\agents\_work\14\s\BPS.metaproj"(2)。 使用工具版本"Current"构建。 目标"GetFrameworkPathAndRedistList"位于项目"C:\agents\_work\14\s\BPS.metaproj"(目标"Build"依赖于此): 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"GetFrameworkPath"任务。 任务"GetFrameworkPath" 完成执行任务"GetFrameworkPath"。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"CreateItem"任务。 任务"CreateItem" 完成执行任务"CreateItem"。 完成在项目"BPS.metaproj"中构建目标"GetFrameworkPathAndRedistList"。 目标"Build"位于项目"C:\agents\_work\14\s\BPS.metaproj"(入口点): 任务"MSBuild" 完成执行任务"MSBuild"。 任务"CreateItem" 完成执行任务"CreateItem"。 任务"ReadLinesFromFile"跳过,因为条件不成立;( '%(Project_5FA4972F-7390-4264-B5EC-083A69B2FD82_References_RefreshFile.Identity)' != '' ) 计算结果为 ( '' != '' )。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"CombinePath"任务。 任务"CombinePath" 完成执行任务"CombinePath"。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"Copy"任务。 任务"Copy" 完成执行任务"Copy"。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"GetReferenceAssemblyPaths"任务。 任务"GetReferenceAssemblyPaths" 完成执行任务"GetReferenceAssemblyPaths"。 任务"ResolveAssemblyReference"跳过,因为条件不成立;(Exists('%(Project_5FA4972F-7390-4264-B5EC-083A69B2FD82_References.Identity)')) 计算结果为 (Exists(''))。 任务"Copy" 完成执行任务"Copy"。 使用来自程序集"Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"的"AspNetCompiler"任务。 任务"AspNetCompiler" C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /BPS -p ..\..\..\..\..\inetpub\wwwroot\BPS\ -u -f -d PrecompiledWeb\BPS\ Microsoft (R) ASP.NET编译工具版本4.8.3761.0 预编译ASP.NET应用程序的工具 版权所有(C) Microsoft Corporation。保留所有权利。 完成执行任务"AspNetCompiler"。 任务"Message"跳过,因为条件不成立;(!((false) or ('$(AspNetConfiguration)' == 'Debug') or ('$(AspNetConfiguration)' == 'Release'))) 计算结果为 (!((false) or ('Debug' == 'Debug') or ('Debug' == 'Release')))。 完成在项目"BPS.metaproj"中构建目标"Build"。 完成构建项目"C:\agents\_work\14\s\BPS.metaproj"(默认目标)。 完成执行任务"MSBuild"。 完成在项目"BPS.sln"中构建目标"Build"。 完成构建项目"C:\agents\_work\14\s\BPS.sln"(默认目标)。 构建成功。 0 个警告 0 个错误
解决方案建议
指定正确的AspNetCompiler版本
日志显示当前使用的是.NET Framework 4.0版本的aspnet_compiler.exe,与应用的4.8版本不匹配。在VS Build任务的MSBuild参数中添加:/p:ToolPath="C:\Windows\Microsoft.NET\Framework\v4.8.3761.0\"确保使用对应版本的编译工具。
调整构建输出配置
- 移除
PackageAsSingleFile=true参数,改为生成松散文件输出,保证bin文件夹被正确包含; - 检查项目中NuGet引用的DLL属性,将复制本地设置为
True,确保构建时DLL被复制到输出目录。
- 移除
优化流水线复制步骤
- 修改复制命令,添加
**\bin\**作为源路径的一部分,确保bin目录被纳入复制范围; - 验证发布工件的内容,确认bin文件夹已包含在发布包中。
- 修改复制命令,添加
修复NuGet引用解析问题
- 在构建任务中添加
NuGet Install步骤,确保包被正确还原到本地并被MSBuild识别; - 检查项目文件,确认所有NuGet引用的路径配置正确,避免
ResolveAssemblyReference任务被跳过。
- 在构建任务中添加
内容的提问来源于stack exchange,提问作者Joel Nnogo
相关产品推荐
相关产品推荐

