.NET Framework Windows应用Azure DevOps构建未生成.EXE文件问题
问题根因
配置错误本质是混淆了.NET Framework和.NET Core/.NET 5+的构建规则,具体有4个核心问题:
PublishSingleFile、RuntimeIdentifier是.NET Core 3.0+才支持的发布参数,.NET Framework 4.7.2完全不识别,执行时会直接跳过这两个配置,自然不会按预期输出可执行文件- 重复执行还原操作:
NuGetCommand@2已经完成了所有NuGet包的还原,额外加的带/t:restore参数的VSBuild步骤纯属多余,还会打乱中间编译目录的文件结构 - 输出路径参数写错:.NET Framework构建指定最终输出目录的参数是
OutDir,不是.NET Core体系下的outputpath,参数不匹配会导致编译好的文件留在临时编译目录,不会落到你指定的制品暂存路径 - 直接对解决方案文件执行发布:如果你的解决方案下包含多个类库项目,直接发布sln会把输出拆分到各个项目对应的子目录,最终在你指定的输出路径下找不到启动项目生成的exe
- 补充:你选的
windows-2019镜像自带VS2019,完全兼容.NET Framework 4.7.2的构建,镜像选择没有问题
修正后的配置
直接替换成下面的YAML即可,注意把变量里的startupProject换成你实际启动项目(就是生成exe的那个桌面项目)的csproj相对路径:
trigger: - Development pool: vmImage: 'windows-2019' variables: solution: '**/*.sln' buildPlatform: 'x86' buildConfiguration: 'debug' # 替换为你实际的启动项目路径,例如 'src/MyDesktopApp/MyDesktopApp.csproj' startupProject: '**/你的启动项目名.csproj' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(startupProject)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' msbuildArgs: '/t:Build /p:OutDir=$(Build.ArtifactStagingDirectory)\ /p:GenerateProjectSpecificOutputFolder=False'
额外说明
- 移除了多余的VSBuild还原步骤,保留NuGet还原即可解决缺失引用的问题,不需要重复执行还原
- .NET Framework 4.7.2原生不支持单文件打包发布,如果需要把所有依赖dll合并进一个exe,需要在项目里安装Costura.Fody等打包工具,靠MSBuild参数无法实现这个功能
- 加了
GenerateProjectSpecificOutputFolder=False参数,避免编译时自动生成项目名嵌套目录,构建完成后exe会直接出现在$(Build.ArtifactStagingDirectory)根路径下,方便后续发布制品
内容的提问来源于stack exchange,提问作者prasantha kumara
相关产品推荐
相关产品推荐

