如何以编程方式找到由 Nuget 恢复的 DLL?

How can I programmatically find a DLL restored by Nuget?

用户执行 dotnet add package <SomePackage> 后,DLL 将安装到类似于以下的路径:

C:\Users\USER\.nuget\packages\SomePackage.0.2\lib\netstandard2.0\SomePackage.dll

如何以编程方式找到此路径?我看到 obj/project.assets.json 中有一些我可以解析的信息,还有一个有趣的 DependencyContextJsonReader class 在 dotnet github 组织下。

但是,我找不到关于此的文档或讨论,我不确定这是否是因为我采用了错误的方法。

一些背景: 我正在编写一个可以搭建 C# 项目脚手架的工具。它结合使用 dotnet 命令行工具和 Roslyn Workspace API 与生成的项目进行交互。我现在想允许用户将 Nuget 包安装到这个生成的解决方案中。我调用 dotnet add package SomePackage 效果很好,现在我想使用 AddReferences API 将 DLL 添加到 Roslyn Project 对象,这需要实际的 DLL。

我找到了使用 nuget 客户端库执行此操作的方法。

本质上,我可以直接从我的应用程序使用 NuGet 客户端库来安装包,而不是使用 dotnet add package 命令。然后我可以通过 PackagePathResolver.GetInstalledPath 方法访问完整路径。

马丁·比约克斯特伦的 post、Revisiting the NuGet v3 Libraries, goes into much more detail, and a fully working code sample from Martin is available in this gist