You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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批量拦截(推荐)

  1. 右键对应项目选择「卸载项目」,再次右键选择「编辑[项目名].csproj」
  2. 在<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>
  1. 保存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:39:34