完整获取旧模式依赖结构代码
完整代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using NuGet.ProjectModel; 5 using NuGet.PackageManagement; 6 using NuGet.Common; 7 using NuGet.Packaging.Core; 8 using NuGet.Protocol; 9 using NuGet.Protocol.Core.Types; 10 using NuGet.Versioning; 11 using static NuGet.Frameworks.FrameworkConstants; 12 using static NuGet.Protocol.Core.Types.Repository; 13 using System.Threading; 14 using System.Threading.Tasks; 15 using NuGet.Test.Utility; 16 using System.IO; 17 using System.Text.RegularExpressions; 18 using System.Xml.Linq; 19 using System.Xml; 20 using NuGet.Frameworks; 21 22 namespace Test_Tools.获取直接依赖 23 { 24 class Get_Old_dependency_Async 25 { 26 public static string Project = @"D:\VS2017\WorkSpace\BUG\Exception\新旧模式\项目中新旧模式混杂\framework(旧0-》旧1-》新2-》旧3)"; 27 public static string Project_file_path = "D:\\VS2017\\WorkSpace\\BUG\\Exception\\新旧模式\\项目中新旧模式混杂\\framework(旧0-》旧1-》新2-》旧3)\\Test_1\\Test_1.csproj"; 28 public static async Task GetDependencyInfoForPackageIdentitiesAsync(string Project,string Project_file_path) 29 { 30 using (var pathContext = new SimpleTestPathContext()) 31 { 32 string Path_Resorece = Project + @"\packages"; 33 //直接获取nupkg包这样的环境 34 var sourceReposistory = Factory.GetCoreV3(Path_Resorece); 35 //读取packages.config里面的信息 36 var installedList = new List<PackageIdentity>(); 37 var Packages_config_path = Get_packages_config(Project_file_path); 38 var elements = Read_XML(Packages_config_path); 39 foreach (var element in elements) 40 { 41 var ele_name = element.Attribute("id").Value; 42 var ele_version = element.Attribute("version").Value; 43 installedList.Add(new PackageIdentity(ele_name, NuGetVersion.Parse(ele_version))); 44 } 45 //工作的流程——》把所有的依赖项都放到一起,制作出来一个环境,然后根据这些环境构建之间的依赖关系 46 // Act 47 var packageDependencyInfos = await PackageGraphAnalysisUtilities.GetDependencyInfoForPackageIdentitiesAsync( 48 packageIdentities: installedList, 49 nuGetFramework: Trans_framework(Project_file_path),//甚至可以判断出来平台的兼容性!!!!!!! 50 dependencyInfoResource: await sourceReposistory.GetResourceAsync<DependencyInfoResource>(),//从Resourse中返回资源 51 sourceCacheContext: new SourceCacheContext(), 52 includeUnresolved: true, 53 logger: NullLogger.Instance, 54 cancellationToken: CancellationToken.None 55 ); 56 // Assert 57 var Tops_List = new List<PackageDependencyInfo>(); 58 foreach (var package in packageDependencyInfos) 59 { 60 var packageIdentity = new PackageIdentity(package.Id, package.Version); 61 var packageDependencyInfo = new PackageDependencyInfo(packageIdentity, Enumerable.Empty<PackageDependency>()); 62 if (package.Dependencies.Count() > 0) 63 { 64 var PackageDependency_ = package.Dependencies; 65 packageDependencyInfo = new PackageDependencyInfo(packageIdentity, PackageDependency_); 66 67 } 68 Tops_List.Add(packageDependencyInfo); 69 } 70 //通过依赖图构建全局关系 71 var packageWithDependants = PackageGraphAnalysisUtilities.GetPackagesWithDependants(Tops_List); 72 73 Console.WriteLine(Get_project_name(Project_file_path)); 74 Console.WriteLine("targetFramework_start"); 75 Console.WriteLine(Trans_framework(Project_file_path).ToString()); 76 foreach (var package in packageWithDependants) 77 { 78 if (package.IsTopLevelPackage) 79 { 80 Console.WriteLine(package.Identity.Id + ">=" + package.Identity.Version); 81 82 } 83 } 84 Console.WriteLine("targetFramework_end"); 85 } 86 87 } 88 public static string Get_packages_config(string Project_file_path) 89 { 90 //Test_1 - 副本.csproj 91 var Project_folder = Project_file_path.Split("\\").Where(x => Regex.IsMatch(x, @"\.csproj$")).Last(); 92 var pattern = @"(?<folder>.+?)\\" + Project_folder + @"$"; 93 var Project_Path = Regex.Matches(Project_file_path, pattern).First().Groups["folder"].ToString(); 94 var Packages_config = Project_Path + @"\packages.config"; 95 if (!File.Exists(Packages_config)) 96 Packages_config = ""; 97 return Packages_config; 98 //同时还需要读取他的项目引用 99 } 100 public static string Get_project_name(string Project_file_path) 101 { 102 //Test_1 - 副本.csproj 103 var Project_folder = Project_file_path.Split("\\").Where(x => Regex.IsMatch(x, @"\.csproj$")).Last(); 104 Project_folder = Project_folder.Replace(".csproj", ""); 105 return Project_folder; 106 //同时还需要读取他的项目引用 107 } 108 public static XmlElement Get_Project_reference(string File_path) 109 { 110 XmlReaderSettings xs = new XmlReaderSettings(); 111 xs.XmlResolver = null; 112 xs.ProhibitDtd = false; 113 XmlReader xr = XmlReader.Create(File_path, xs); 114 XmlDocument xmldoc = new XmlDocument(); 115 xmldoc.Load(xr); 116 XmlNamespaceManager nameSpace = new XmlNamespaceManager(xmldoc.NameTable); 117 XElement xe = XElement.Load(File_path); 118 var xmlns_value = xe.Attribute("xmlns").Value; 119 nameSpace.AddNamespace("XMLNS", xmlns_value); 120 XmlElement resume = xmldoc.DocumentElement; 121 var Project_references = resume.SelectNodes("//XMLNS:ItemGroup/XMLNS:ProjectReference", nameSpace); 122 foreach (XmlElement element in Project_references) 123 { 124 string id = element.GetElementsByTagName("Name")[0].InnerText; 125 Console.WriteLine(id); 126 } 127 return null; 128 } 129 130 public static IEnumerable<XElement> Read_XML(string File_path) 131 { 132 XElement xe = XElement.Load(File_path); 133 var elements = from ele in xe.Elements() 134 select ele; 135 return elements; 136 } 137 //目前还是无法获得当前的框架!!!!!!! 138 public static NuGetFramework Trans_framework(string File_path) 139 { 140 XmlReaderSettings xs = new XmlReaderSettings(); 141 xs.XmlResolver = null; 142 xs.ProhibitDtd = false; 143 XmlReader xr = XmlReader.Create(File_path, xs); 144 XmlDocument xmldoc = new XmlDocument(); 145 xmldoc.Load(xr); 146 XmlNamespaceManager nameSpace = new XmlNamespaceManager(xmldoc.NameTable); 147 XElement xe = XElement.Load(File_path); 148 var xmlns_value = xe.Attribute("xmlns").Value; 149 nameSpace.AddNamespace("XMLNS", xmlns_value); 150 XmlElement resume = xmldoc.DocumentElement; 151 var Project_references = resume.SelectNodes("//XMLNS:PropertyGroup/XMLNS:TargetFrameworkVersion", nameSpace); 152 Console.WriteLine(Project_references.Count); 153 var Versions = ""; 154 foreach (XmlElement element in Project_references) 155 { 156 Versions = element.InnerText; 157 } 158 159 var Fram_Type = ".NETFramework"; 160 var Fram_version = Versions.Split("v").Last(); 161 var Fram_version_list = Fram_version.Split("."); 162 int major = 0; 163 int minor = 0; 164 int build = 0; 165 int revision = 0; 166 int nnum = 0; 167 foreach (var version in Fram_version_list) 168 { 169 switch (nnum) 170 { 171 case 0: 172 major = int.Parse(version); 173 break; 174 case 1: 175 minor = int.Parse(version); 176 break; 177 case 2: 178 build = int.Parse(version); 179 break; 180 case 3: 181 revision = int.Parse(version); 182 break; 183 default: break; 184 } 185 nnum++; 186 } 187 return new NuGetFramework(Fram_Type, new Version(major, minor, build, revision)); 188 } 189 190 191 } 192 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异