.NET Core迁移后多Exe/WinExe项目配置文件异常删除问题咨询
问题分析与根本解决方案
核心原因定位
这个问题的本质大概率是GUI项目与CLI项目的输出目录(OutputPath)设置为同一路径,触发了MSBuild Rebuild目标的默认行为:
- 执行解决方案级Rebuild时,每个项目会依次执行自身的
Clean目标,再执行Build目标。如果两个项目输出到同一目录,CLI项目执行Clean时会清空该目录下的所有文件(包括GUI项目刚生成的*.deps.json和*.runtimeconfig.json)。 - 而先执行解决方案级Clean再执行Build时,Clean会一次性清空所有项目输出目录,之后Build按依赖顺序执行(GUI先构建生成文件,CLI构建仅生成自身文件,不会再触发Clean),因此不会出现文件被删除的情况。
根本解决方案
方案1:分离两个入口项目的输出目录
这是最直接且推荐的方案,彻底避免输出路径冲突:
- 右键GUI项目 → 属性 → 生成 → 输出 → 修改“输出路径”,例如从默认的
bin\$(Configuration)\$(TargetFramework)\改为bin\$(Configuration)\$(TargetFramework)\GUI\ - 右键CLI项目 → 属性 → 生成 → 输出 → 修改“输出路径”,例如改为
bin\$(Configuration)\$(TargetFramework)\CLI\ - 保存设置后,重新执行Rebuild验证。
方案2:自定义MSBuild Clean目标,避免删除非自身文件
如果因需求必须共用输出目录,可以修改CLI项目的MSBuild配置,让Clean仅删除自身生成的文件:
- 在CLI项目的
.csproj文件中添加以下配置:
<Target Name="CustomClean" BeforeTargets="Clean"> <!-- 仅删除CLI项目自身的输出文件 --> <Delete Files="$(OutputPath)$(AssemblyName).*" /> <Delete Files="$(OutputPath)dotnet-$(AssemblyName).*" Condition="$(UseAppHost) == true" /> </Target> <!-- 禁用默认的目录级Clean --> <PropertyGroup> <SkipDefaultClean>true</SkipDefaultClean> </PropertyGroup>
- 保存后重新Rebuild解决方案,CLI项目的Clean步骤只会删除自身的输出文件,不会影响GUI项目的文件。
验证方法
- 执行解决方案级Rebuild,检查GUI项目的
*.deps.json和*.runtimeconfig.json是否保留 - 运行GUI和CLI项目,确认功能正常,依赖加载无异常
内容的提问来源于stack exchange,提问作者tlivaja
相关产品推荐
相关产品推荐

