//===================================================================== /// <summary> /// This can be used to load an empty location with information about the assemblies it contains /// </summary> /// <param name="clearAndRefresh">True to clear and refresh all file information or false to only remove /// assemblies that no longer exist and add new assemblies.</param> public void DetermineAssemblyDetails(bool clearAndRefresh) { if (clearAndRefresh) { assemblyDetails.Clear(); } if (!String.IsNullOrWhiteSpace(this.Path) && Directory.Exists(this.Path)) { HashSet <string> assemblyDescs = new HashSet <string>(assemblyDetails.Select(a => a.Description)); // Remove entries that are not there anymore foreach (var d in assemblyDetails.ToList()) { if (!File.Exists(d.Filename)) { assemblyDetails.Remove(d); } } // Add missing entries foreach (string assembly in Directory.EnumerateFiles(this.Path, "*.dll").Concat( Directory.EnumerateFiles(this.Path, "*.winmd"))) { try { var details = AssemblyDetails.FromAssemblyName(AssemblyName.GetAssemblyName(assembly)); if (!assemblyDescs.Contains(details.Description)) { assemblyDetails.Add(details); } } catch (BadImageFormatException ex) { // Ignore, not a .NET assembly System.Diagnostics.Debug.WriteLine(ex.FileName); } } } }
//===================================================================== /// <summary> /// This can be used to load an empty location with information about the assemblies it contains /// </summary> /// <param name="clearAndRefresh">True to clear and refresh all file information or false to only remove /// assemblies that no longer exist and add new assemblies.</param> public void DetermineAssemblyDetails(bool clearAndRefresh) { string version, assemblyName; if (clearAndRefresh) { assemblyDetails.Clear(); } if (!String.IsNullOrWhiteSpace(this.Path) && Directory.Exists(this.Path)) { HashSet <string> assemblyDescs = new HashSet <string>(assemblyDetails.Select(a => a.Description)); // Remove entries that are not there anymore foreach (var d in assemblyDetails.ToList()) { if (!File.Exists(d.Filename)) { assemblyDetails.Remove(d); } } // Add missing entries foreach (string assembly in Directory.EnumerateFiles(this.Path, "*.dll").Concat( Directory.EnumerateFiles(this.Path, "*.winmd"))) { try { var details = AssemblyDetails.FromAssemblyName(AssemblyName.GetAssemblyName(assembly)); if (!assemblyDescs.Contains(details.Description)) { assemblyDetails.Add(details); } } catch (BadImageFormatException ex) { // Ignore, not a .NET assembly System.Diagnostics.Debug.WriteLine(ex.FileName); } } // The SDK folders for .NETCore 5.0 are typically in one of two formats so this gets a bit ugly. foreach (string sdkFolder in Directory.EnumerateDirectories(this.Path)) { // RootFolder\AssemblyName\Version\ref\dotnet\ version = Directory.EnumerateDirectories(sdkFolder).Where( d => Char.IsDigit(d[d.LastIndexOf('\\') + 1])).OrderBy(d => d).LastOrDefault(); if (version != null) { assemblyName = IOPath.Combine(version, @"ref\dotnet", sdkFolder.Substring(sdkFolder.LastIndexOf('\\') + 1)); if (File.Exists(assemblyName + ".dll")) { assemblyName += ".dll"; } else if (File.Exists(assemblyName + ".winmd")) { assemblyName += ".winmd"; } else { assemblyName = null; } if (assemblyName != null) { var details = AssemblyDetails.FromAssemblyName( AssemblyName.GetAssemblyName(assemblyName)); if (!assemblyDescs.Contains(details.Description)) { assemblyDetails.Add(details); } continue; } } // RootFolder\AssemblyName\Version\ version = Directory.EnumerateDirectories(sdkFolder).Where( d => Char.IsDigit(d[d.LastIndexOf('\\') + 1])).OrderBy(d => d).LastOrDefault(); if (version != null) { assemblyName = IOPath.Combine(version, sdkFolder.Substring(sdkFolder.LastIndexOf('\\') + 1)); if (File.Exists(assemblyName + ".dll")) { assemblyName += ".dll"; } else if (File.Exists(assemblyName + ".winmd")) { assemblyName += ".winmd"; } else { assemblyName = null; } if (assemblyName != null) { var details = AssemblyDetails.FromAssemblyName( AssemblyName.GetAssemblyName(assemblyName)); if (!assemblyDescs.Contains(details.Description)) { assemblyDetails.Add(details); } } } } } }