/// <summary>
		/// Gets the Mono Gac directory based on the assembly name.
		/// </summary>
		/// <remarks>
		/// If the assembly name is not fully qualified then this method returns
		/// null.
		/// </remarks>
		public static MonoGacDirectory GetAssemblyDirectory(string gacBaseDirectory, MonoAssemblyName assemblyName)
		{
			if (assemblyName.IsFullyQualified) {
				return new MonoGacDirectory(gacBaseDirectory, assemblyName);
			}
			return null;
		}
		/// <summary>
		/// Determines whether the assembly names match.
		/// </summary>
		/// <returns>
		/// Handles partially qualified assembly names and will return 
		/// <see langword="true"/> if the match is a partial match.
		/// </returns>
		public bool IsMatch(MonoAssemblyName assemblyName)
		{
			if (name == assemblyName.Name) {
				if (assemblyName.publicKeyToken != null && publicKeyToken != null) {
					if (assemblyName.publicKeyToken.Length == publicKeyToken.Length) {
						for (int i = 0; i < publicKeyToken.Length; ++i) {
							if (publicKeyToken[i] != assemblyName.publicKeyToken[i]) {
								return false;
							}
						}
					}
				}
				if (assemblyName.version != null && version != null) {
					if (assemblyName.version != version) {
						return false;
					}
				}
				if (assemblyName.cultureInfo != null && cultureInfo != null) {
					if (assemblyName.cultureInfo == cultureInfo) {
						return false;
					}
				}
				return true;
			}
			return false;
		}
		public MonoGacDirectory(string gacBaseDirectory, MonoAssemblyName assemblyName)
		{
			this.gacBaseDirectory = gacBaseDirectory;
			this.assemblyName = assemblyName;
		}
		public MonoGacDirectory(string gacBaseDirectory, string assemblyDirectoryName, string versionDirectoryName)
		{
			string assemblyDirectory = Path.Combine(gacBaseDirectory, Path.Combine(assemblyDirectoryName, versionDirectoryName));
			assemblyName = new MonoAssemblyName(GetAssemblyName(assemblyDirectoryName, versionDirectoryName), assemblyDirectory);
		}
		/// <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;
		}