如何在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
相关产品推荐
相关产品推荐

