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

如何在MSBuild中获取所有被引用DLL文件的路径?

这个需求很常见,而且确实有办法一次性搞定所有类型的引用,同时完全避免触发构建操作!结合你已经掌握的项目引用方案,我们可以扩展出覆盖NuGet包、直接DLL引用的通用解法,下面详细说:

通用解决方案:一次性获取所有引用程序集路径

可以通过自定义一个MSBuild目标,分别处理不同类型的引用,同时保证不触发构建:

<Target Name="GetAllReferencedAssemblies">
  <!-- 处理项目引用:复用你提到的轻量目标 -->
  <MSBuild Projects="@(ProjectReference)" Targets="GetTargetPath" BuildInParallel="false">
    <Output TaskParameter="TargetOutputs" ItemName="AllReferencedAssemblies" />
  </MSBuild>

  <!-- 处理NuGet包和直接DLL引用:用轻量解析任务 -->
  <ResolveAssemblyReference
    Assemblies="@(Reference)"
    SearchPaths="$(AssemblySearchPaths)"
    ResolveDependencies="false"
    SkipGac="true"
    IgnoreDefaultInstalledAssemblySubset="true">
    <Output TaskParameter="ResolvedFiles" ItemName="AllReferencedAssemblies" />
  </ResolveAssemblyReference>

  <!-- 可选:输出结果用于验证 -->
  <Message Text="所有引用程序集路径:@(AllReferencedAssemblies)" Importance="high" />
</Target>

各部分细节说明

  • 项目引用:你用的GetTargetPath是MSBuild内置的轻量目标,它只会返回项目编译后的目标程序集路径,不会触发完整的项目构建,完美符合你的要求。
  • NuGet包/直接DLL引用:ResolveAssemblyReference是MSBuild专门用来解析程序集引用的任务,这里我们配置了几个关键参数:
    • ResolveDependencies="false":只解析直接引用的程序集,不递归处理依赖(如果需要间接引用可以改成true)
    • SkipGac="true":跳过全局程序集缓存查找,加快解析速度
    • $(AssemblySearchPaths):自动包含NuGet包的默认安装路径(比如用户目录下的.nuget\packages或项目本地的packages文件夹),也会包含项目的输出目录和系统默认路径,确保能找到所有直接引用的DLL。

使用方法

在命令行运行以下命令,就能获取所有引用路径,完全不会触发项目构建:

msbuild /t:GetAllReferencedAssemblies YourProject.csproj

额外优化

如果你的项目有自定义的本地DLL目录(比如项目根目录下的Libs文件夹),可以手动添加到搜索路径里,确保能找到这些DLL:

<PropertyGroup>
  <AssemblySearchPaths>$(AssemblySearchPaths);$(SolutionDir)\Libs</AssemblySearchPaths>
</PropertyGroup>

这样不管是项目引用、NuGet包还是手动添加的本地DLL,都能一次性获取到它们的完整路径啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:03:12