如何配置Visual Studio使NuGet包DLL仅生成在直接引用项目路径
.NET Framework 4.8 阻止NuGet依赖DLL重复复制到上层项目输出目录配置方案
适用引用链结构:项目A(直接引用大体积NuGet)→ 项目B(引用A)→ 项目C/D/E(引用B),目标为仅保留项目A输出目录下的NuGet DLL,其余项目不重复复制。
步骤1:配置项目A的基础输出规则
打开项目A的引用列表,找到该150MB NuGet包对应的所有DLL条目,将每个条目的**复制本地(Copy Local)**属性设置为True,确保生成解决方案时,这些DLL会正常写入项目A的配置输出路径。
不要修改项目A对该NuGet包的其他默认引用配置,避免项目A本身编译、运行时找不到依赖。
步骤2:拦截上层项目的DLL复制行为
两种可选方案,推荐直接修改csproj的批量方案,后续更新NuGet版本也不会失效:
方案1:可视化界面配置(适合项目量少的场景)
- 分别打开项目B、C、D、E的引用列表,列表中会自动出现该NuGet包对应的传递依赖DLL条目
- 逐个选中这些DLL条目,将复制本地属性统一设置为
False - 保存所有项目修改即可生效
方案2:修改csproj批量拦截(推荐)
- 右键对应项目选择「卸载项目」,再次右键选择「编辑[项目名].csproj」
- 在
<Project>根节点下添加如下MSBuild配置:
<ItemGroup> <!-- 替换为需要拦截的NuGet对应DLL文件名,不带.dll后缀,多个DLL可新增多个DoNotCopyLocal节点 --> <DoNotCopyLocal Include="YourLargeNuGetAssemblyName1" /> <DoNotCopyLocal Include="YourLargeNuGetAssemblyName2" /> </ItemGroup> <Target Name="SkipSpecifiedAssemblyCopy" BeforeTargets="CopyFilesToOutputDirectory"> <ItemGroup> <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" Condition="@(DoNotCopyLocal)->Contains('%(FileName)')" /> </ItemGroup> </Target>
- 保存csproj文件,重新加载项目即可。该配置会在生成阶段直接从待复制列表中移除指定DLL,不会将文件写入当前项目输出目录。
步骤3:运行时路径配置(必做,避免启动报错)
由于上层项目输出目录不存在该DLL,需要配置程序集搜索路径,保证运行时能从项目A的输出目录加载对应文件:
如果C/D/E是可执行项目,直接修改对应项目的App.config,添加私有探测路径配置:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 替换为项目A输出目录相对于当前exe输出目录的相对路径 --> <probing privatePath="../ProjectA/bin/Release"/> </assemblyBinding> </runtime> </configuration>
如果是动态加载的类库项目,直接在程序集加载逻辑中,将项目A的输出目录加入程序集搜索路径即可。
内容的提问来源于stack exchange,提问作者Skworec
相关产品推荐
相关产品推荐

