为什么Visual Studio 2019生成项目后会删除已引用的程序集?
被设为Copy Local的程序集生成后又被删除的常见原因
- 自定义/第三方MSBuild清理Target的后置执行
你现在用生成后事件执行dir $(TargetDir)验证dll存在的节点,是常规CopyLocal文件复制流程刚完成的较早阶段。多项目解决方案经常会内置或引入输出目录精简逻辑,这类逻辑的执行时序排在普通生成后事件后面:它会扫描输出目录的所有程序集,把没有被项目代码实际引用、没纳入最终依赖清单的文件判定为冗余项直接删掉。哪怕你手动把引用的Copy Local开成true,只要这个程序集没有被代码直接引用、也没被其他项目声明为必须传递的依赖,就会被这类清理逻辑移走。 - 同解决方案内多项目输出路径耦合引发的清理操作
如果当前项目和解决方案里其他项目配了完全一样的输出目录,其他项目跑自己的生成流程时,自带的“清空目标目录旧文件”步骤会在更晚的时序触发,直接抹掉你项目刚复制进去的dll。这类问题的典型表现是:单独生成当前目标项目时dll不会丢,只要在解决方案层级全量编译、连带生成其他关联项目时,dll就会被自动清掉。 - .NET SDK内置依赖裁剪规则的误判
如果当前项目是基于.NET Core/.NET 5+的项目而非老的.NET Framework项目,SDK自带的输出裁剪逻辑会自动把不符合当前目标框架、没进加载路径白名单的引用程序集从输出目录移除。就算手动开了Copy Local属性,只要项目文件里没给这个引用显式配上Private=true、CopyLocalAlways=true的标记,SDK的裁剪流程就会把这个dll识别为无效依赖删掉。 - 快速定位删除来源的实用方法
可以临时在项目文件的第一个<PropertyGroup>节点里加两个属性:<DisableCleanPublishOutput>true</DisableCleanPublishOutput>、<MSBuildWarningsAsMessages>NETSDK1013</MSBuildWarningsAsMessages>,重新生成后调出VS的详细生成日志,搜Deleting file关键字对应的条目,就能直接看到到底是哪个MSBuild任务触发的删除操作。
内容的提问来源于stack exchange,提问作者GaryW
相关产品推荐
相关产品推荐

