Exemple #1
0
        //=====================================================================

        /// <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);
                    }
                }
            }
        }
Exemple #2
0
        //=====================================================================

        /// <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);
                            }
                        }
                    }
                }
            }
        }