获取 .Net Core 3.1 中包含在 csproj 中的 nuget 包版本

Get nuget package version included in csproj in .Net Core 3.1

简而言之,我希望能够以编程方式修改 .csproj 文件。

我正在开发一个用实际项目引用替换 nuget 包的应用程序。这是用于调试目的的应用程序。我们在解决方案文件中添加了大量的包。为此,我读取了一个 csproj 文件并应用了一个正则表达式来查找指定的 nuget 包引用并添加了一个项目引用。这部分工作正常,但它不再选择包了。

以上可以使用 dotnet 命令完成,但使用它我无法替换旧版本。

是否有任何 Microsoft nuget 包可以读取 csproj 文件中的包引用?

类似的问题被问到 here 但 Build.Engine 在最新版本中不可用。

Is there any Microsoft nuget package available which can read the package references in csproj files?

据我所知,Microsoft.Build.Engine不支持编辑New Sdk格式工程([=3​​0=]Net Core)并且是与此 nuget 包不兼容。此 nuget 包仅适用于旧的 sdk 格式项目(Net Framework),您无法编辑 Net Core 项目的 xml 元素。

Get nuget package version included in csproj in .Net Core 3.1

因为你想获得 Nuget 包引用和它们的版本,你可以通过编程尝试这个功能:

public class PackageReference
        {
            public string Include { get; set; } //get the nuget reference name
            public Version Version { get; set; } // get thee nuget package version
        }


        static void Main(string[] args)
        {

    //load the xxx.csproj file
            var doc = XDocument.Load("C:\xxxx\xxxx\xxx\xxx\xxx.csproj");
            var packageReferences = doc.XPathSelectElements("//PackageReference")
                .Select(pr => new PackageReference
                {
                    Include = pr.Attribute("Include").Value,
                    Version = new Version(pr.Attribute("Version").Value)
                });

            Console.WriteLine($"Project file contains {packageReferences.Count()} package references:");
            foreach (var packageReference in packageReferences)
            {
                Console.WriteLine($"{packageReference.Include}, version {packageReference.Version}");
            }


        }

更新 1

只需在网络框架项目中安装 Microsoft.Build and Microsoft.Build.Utilities.Core 然后键入这些可以在 xxx.csproj 文件中设置 属性 就像 Build.Engine nuget 包一样。

注意应该写在net framework项目中而不是net core或net standard项目中(会出错)

using Microsoft.Build.Evaluation;
.......
{
    class Program
    {

        static void Main(string[] args)
        {
            var collection = new ProjectCollection();
            var project = collection.LoadProject(@"xx:\xxx\xxx\xxx.csproj");
            project.SetProperty("Test","true");

            project.Save(@"xx:\xxx\xxx\xxx.csproj");


        }
    }
}

希望对您有所帮助。