如何设置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>
- .NET Core/.NET 5+项目:直接在同一个
- 第三步:添加构建重定向规则
在.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
相关产品推荐
相关产品推荐

