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

如何设置C#项目NuGet依赖dll的输出子文件夹

NuGet依赖DLL输出到独立子文件夹的配置方法

可以通过MSBuild构建规则搭配运行时探测路径配置实现该需求,具体操作如下:

适用范围

以下方案针对主流SDK风格项目,兼容.NET Core 3.1+、.NET 5/6/7/8等新版本.NET,以及迁移为SDK格式的.NET Framework项目。

操作步骤

  • 第一步:指定NuGet依赖输出子目录
    右键项目选择「编辑项目文件」,打开.csproj文件,在第一个<PropertyGroup>节点内添加如下配置,自定义NuGet二进制文件的存放子目录名:
    <NuGetDepsSubFolder>deps</NuGetDepsSubFolder>
    
  • 第二步:配置运行时依赖探测路径
    程序启动时默认只会从exe所在根目录加载依赖,需要额外配置让运行时去你指定的子目录查找dll,不同框架配置方式有区别:
    • .NET Core/.NET 5+项目:直接在同一个<PropertyGroup>节点下追加如下配置即可,构建时会自动将探测路径写入运行时配置文件,无需手动修改其他文件:
      <AdditionalProbingPaths>$(NuGetDepsSubFolder)</AdditionalProbingPaths>
      
    • .NET Framework项目:在项目根目录添加或修改已有App.config文件,在<configuration>节点下添加程序集探测规则:
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="deps" />
        </assemblyBinding>
      </runtime>
      
  • 第三步:添加构建重定向规则
    在.csproj文件末尾的</Project>闭合标签前,添加如下构建目标,构建过程会自动将所有NuGet来源的需要本地拷贝的依赖输出到指定子目录,不会散落在输出根目录:
    <Target Name="RedirectNuGetDepsToSubFolder" AfterTargets="ResolveAssemblyReferences">
      <ItemGroup>
        <ReferenceCopyLocalPaths
          Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' != ''"
          DestinationSubDirectory="$(NuGetDepsSubFolder)\" />
      </ItemGroup>
    </Target>
    

注意:所有.csproj内的配置节点不要写在注释块或其他无关节点内部,否则配置不会生效。

配置完成后重新生成项目,bin/Release或bin/Debug目录下,所有NuGet包附带的dll、本地化资源、原生二进制文件都会统一存放到deps子文件夹,根目录仅保留项目自身生成的可执行文件、同解决方案内其他项目的输出文件,目录结构会保持整洁。

常见注意事项

  • 该规则仅对NuGet来源的依赖生效,不会移动项目自身编译输出、手动添加的非NuGet引用dll的位置。
  • 单文件发布(PublishSingleFile)、原生AOT发布模式下该配置不会生效,这类发布模式会将所有依赖打包进单个可执行文件,不会生成零散dll文件。
  • 极少数使用自定义程序集加载逻辑的第三方库,若未遵循.NET默认的程序集探测规则,可能需要手动给库传入deps子目录的完整路径,才能正常加载依赖。
  • 老式非SDK格式的.NET Framework项目实现逻辑完全一致,仅需要将构建目标中NuGet包的匹配条件调整为对应老式项目的引用标识即可。

内容的提问来源于stack exchange,提问作者SelfishCrawler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:54:22