.net - 如何使用MSBuildWorkspace获取引用的nuget包?

标签 .net msbuild roslyn packagereference

我正在使用 MSBuildWorkspace 加载解决方案,以便使用 OpenSolutionAsync 进行分析,然后迭代项目。我看不到项目引用的 nuget 包的任何信息。有 MetadataReferences,但这是一个 dll 列表,没有显式版本的库 - 它位于路径中的某个位置,但要提取它,我必须从文本中提取它。有时此列表为空,因为项目加载期间出现一些错误。

有没有办法获得引用库的名称和版本的简单列表?

最佳答案

根据this question discussionMSBuildWorkspace 没有任何能力获取项目的 NuGet 引用。 但是,如果您使用项目 sdk 格式或 packages.config,则可以解析 .csproj 文件。

对于项目 sdk,您可以使用以下代码:

void NugetPackages(Microsoft.CodeAnalysis.Project project)
{
    var csproj = new XmlDocument();
    csproj.Load(project.FilePath);
    var nodes = csproj.SelectNodes("//PackageReference[@Include and @Version]");
    foreach (XmlNode packageReference in nodes)
    {
        var packageName = packageReference.Attributes["Include"].Value;
        var packageVersion = Version.Parse(packageReference.Attributes["Version"].Value);
        // handle package
    }
}

对于旧的 .csproj 格式,您可以使用以下代码:

void NugetPackages(Microsoft.CodeAnalysis.Project project)
{
    var directory = Path.GetDirectoryName(project.FilePath);
    var packagesConfigPath = Path.Combine(directory, "packages.config");
    var packagesConfig = new XmlDocument();
    packagesConfig.Load(packagesConfigPath);
    var nodes = packagesConfig.SelectNodes("//package[@id and @version]");
    foreach (XmlNode packageReference in nodes)
    {
        var packageName = packageReference.Attributes["id"].Value;
        var packageVersion = Version.Parse(packageReference.Attributes["version"].Value);
        // handle package
    }
}

关于.net - 如何使用MSBuildWorkspace获取引用的nuget包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58252179/

相关文章:

.net - 为什么 Moq 不运行重写的 ToString 方法?

c# - 我想捕获所有没有特定标签的标签

logging - 可以修改默认 MSBUILD 记录器中使用的颜色吗?

MSbuild 任务失败,因为 "Any CPU"解决方案构建无序

c# - 在 C# 中尽早终止 Roslyn 脚本

c# - 在 OSX : "No assembly containing System.Object was found" 上使用 .NET Core 从代码调用 Roslyn

c# - 如何使用一个属性来初始化另一个属性?

c# - 为什么返回集合接口(interface)而不是具体类型?

asp.net - 如何在 HttpWebRequest 期间维护 session 值?

c# - MSBUILD 是否在 ARM-CPU 上运行?