/// <summary>
        /// Finds the GAC assembly which matches the specified name.
        /// </summary>
        /// <param name="name">
        /// A short name or a fully qualifed assembly name of the form
        /// (glib-sharp, Version=1.0, Culture=neutral, PublicKeyToken=9449494)
        /// </param>
        public static MonoAssemblyName FindAssemblyName(string name)
        {
            string gacFolder = MonoToolLocationHelper.GetPathToMonoGac();

            if (gacFolder != null)
            {
                MonoAssemblyName assemblyName = CreateMonoAssemblyName(name);
                if (assemblyName != null)
                {
                    if (assemblyName.IsFullyQualified)
                    {
                        MonoGacDirectory directory = MonoGacDirectory.GetAssemblyDirectory(gacFolder, assemblyName);
                        if (directory != null)
                        {
                            assemblyName.Directory = directory.FullPath;
                            return(assemblyName);
                        }
                    }
                    else
                    {
                        return(FindPartialAssemblyName(assemblyName));
                    }
                }
            }
            return(null);
        }
        /// <summary>
        /// Tries to match the partially specified assembly name.
        /// </summary>
        static MonoAssemblyName FindPartialAssemblyName(MonoAssemblyName partialName)
        {
            string assemblyDirectoryName = Path.Combine(MonoToolLocationHelper.GetPathToMonoGac(), partialName.Name);

            if (Directory.Exists(assemblyDirectoryName))
            {
                MonoAssemblyName matchedName = null;
                DirectoryInfo    assemblyNameDirectoryInfo = new DirectoryInfo(assemblyDirectoryName);
                foreach (DirectoryInfo versionDirectoryInfo in assemblyNameDirectoryInfo.GetDirectories())
                {
                    string           assemblyFullName = MonoGacDirectory.GetAssemblyName(assemblyNameDirectoryInfo.Name, versionDirectoryInfo.Name);
                    MonoAssemblyName name             = CreateMonoAssemblyName(assemblyFullName, versionDirectoryInfo.FullName);
                    if (name != null && name.IsFullyQualified)
                    {
                        if (matchedName == null)
                        {
                            if (partialName.IsMatch(name))
                            {
                                matchedName = name;
                            }
                        }
                        else if (partialName.IsMatch(name) && name.Version > matchedName.Version)
                        {
                            matchedName = name;
                        }
                    }
                }
                return(matchedName);
            }

            return(null);
        }
        /// <summary>
        /// Gets all the assembly names in the Mono GAC.
        /// </summary>
        /// <param name="folder">The GAC folder</param>
        public static List <MonoAssemblyName> GetAssemblyNames(string folder)
        {
            List <MonoAssemblyName> assemblyNames = new List <MonoAssemblyName>();

            if (folder != null && Directory.Exists(folder))
            {
                DirectoryInfo gacDirectoryInfo = new DirectoryInfo(folder);
                foreach (DirectoryInfo assemblyNameDirectoryInfo in gacDirectoryInfo.GetDirectories())
                {
                    foreach (DirectoryInfo versionDirectoryInfo in assemblyNameDirectoryInfo.GetDirectories())
                    {
                        string           assemblyFullName = MonoGacDirectory.GetAssemblyName(assemblyNameDirectoryInfo.Name, versionDirectoryInfo.Name);
                        MonoAssemblyName name             = CreateMonoAssemblyName(assemblyFullName);
                        if (name != null)
                        {
                            name.Directory = versionDirectoryInfo.FullName;
                            assemblyNames.Add(name);
                        }
                    }
                }
            }
            return(assemblyNames);
        }