public ICSharpCode.Core.FileName FindAssembly(DomAssemblyName fullName)
        {
            // Try to find assembly among solution projects
            IProjectService projectService = SD.GetRequiredService<IProjectService>();

            ProjectItem projectItem =
                project.Items.FirstOrDefault(
                    item => {
                        if (item.ItemType == ItemType.COMReference) {
                            // Special handling for COM references: Their assembly names are prefixed with "Interop."
                            return fullName.ShortName == "Interop." + item.Include;
                        }
                        if ((item.ItemType == ItemType.ProjectReference) && (item is ProjectReferenceProjectItem)) {
                            // Special handling for project references: Compare with project name instead of file name
                            return (((ProjectReferenceProjectItem) item).ProjectName == fullName.ShortName);
                        }
                        return (item.ItemType == ItemType.Reference) && (item.Include == fullName.ShortName);
                    });

            if (projectItem != null) {
                if (projectItem is ProjectReferenceProjectItem) {
                    // This is a project reference, so FileName delivers the project file instead of assembly binary
                    IProject refProject = ((ProjectReferenceProjectItem) projectItem).ReferencedProject;
                    if (refProject != null) {
                        return refProject.OutputAssemblyFullPath;
                    }
                } else {
                    return projectItem.FileName;
                }
            }

            return null;
        }
예제 #2
0
 void GetAssemblyShortName(string assemblyFullName)
 {
     if (assemblyFullName != null) {
         var domAssemblyName = new DomAssemblyName(assemblyFullName);
         assemblyShortName = "ICSharpCode." + domAssemblyName.ShortName;
     }
 }
        public FileName FindAssembly(DomAssemblyName fullName)
        {
            // look for the assembly in the current loaded assembly lists
            var classBrowser = SD.GetRequiredService<IClassBrowser>();
            var relevantClassBrowserAssemblies = classBrowser.AssemblyLists
                .Where(l => l.Assemblies.Any(a => a.Location == mainAssemblyFileName))
                .SelectMany(l => l.Assemblies);
            foreach (var asm in relevantClassBrowserAssemblies) {
                if (asm.FullAssemblyName == fullName.FullName)
                    return asm.Location;
            }

            // look in GAC
            var gacFileName = SD.GlobalAssemblyCache.FindAssemblyInNetGac(fullName);
            if (gacFileName != null)
                return gacFileName;

            // scan current directory
            var fileName = baseDirectory.CombineFile(fullName.ShortName + ".dll");
            if (File.Exists(fileName))
                return fileName;

            fileName = baseDirectory.CombineFile(fullName.ShortName + ".exe");
            if (File.Exists(fileName))
                return fileName;
            return null;
        }
예제 #4
0
 void GetAssemblyShortName(string assemblyFullName)
 {
     if (assemblyFullName != null)
     {
         var domAssemblyName = new DomAssemblyName(assemblyFullName);
         assemblyShortName = "ICSharpCode." + domAssemblyName.ShortName;
     }
 }
        void AddFileNameForGacReference(string fileName, string reference)
        {
            DomAssemblyName assemblyName = AddMatchingAssemblyNameForGacReference(reference);

            fakeGacService
            .Stub(gac => gac.FindAssemblyInNetGac(assemblyName))
            .Return(new FileName(fileName));
        }
		DomAssemblyName AddMatchingAssemblyNameForGacReference(string reference)
		{
			var assemblyName = new DomAssemblyName(reference);
			var assemblyNameToReturn = new DomAssemblyName("GacReference");
			fakeGacService
				.Stub(gac => gac.FindBestMatchingAssemblyName(assemblyName))
				.Return(assemblyNameToReturn);
			
			return assemblyNameToReturn;
		}
예제 #7
0
		public AssemblyReferenceModel(IAssemblyModel parentAssemblyModel, DomAssemblyName assemblyName)
		{
			if (parentAssemblyModel == null)
				throw new ArgumentNullException("parentAssemblyModel");
			if (assemblyName == null)
				throw new ArgumentNullException("assemblyName");
			
			this.parentAssemblyModel = parentAssemblyModel;
			this.assemblyName = assemblyName;
		}
        DomAssemblyName AddMatchingAssemblyNameForGacReference(string reference)
        {
            var assemblyName         = new DomAssemblyName(reference);
            var assemblyNameToReturn = new DomAssemblyName("GacReference");

            fakeGacService
            .Stub(gac => gac.FindBestMatchingAssemblyName(assemblyName))
            .Return(assemblyNameToReturn);

            return(assemblyNameToReturn);
        }
예제 #9
0
            AssemblyDefinition Resolve(DomAssemblyName name, ReaderParameters parameters)
            {
                var moduleDefinition = GetModuleDefinitionFromCache(FindAssembly(name));

                if (moduleDefinition != null)
                {
                    resolvedAssemblies.Add(moduleDefinition.Assembly);
                    return(moduleDefinition.Assembly);
                }
                return(null);
            }
		string ResolveAssemblyFromGac(string assemblyReference)
		{
			var assemblyName = new DomAssemblyName(assemblyReference);
			DomAssemblyName foundAssemblyName = gac.FindBestMatchingAssemblyName(assemblyName);
			if (foundAssemblyName != null) {
				FileName fileName = gac.FindAssemblyInNetGac(foundAssemblyName);
				if (fileName != null) {
					return fileName.ToString();
				}
			}
			return null;
		}
예제 #11
0
        static string GetAssemblyFile(DomAssemblyName reference, string prefix, string gac)
        {
            var gac_folder = new StringBuilder()
                             .Append(prefix)
                             .Append(reference.Version)
                             .Append("__");

            gac_folder.Append(reference.PublicKeyToken);

            return(Path.Combine(
                       Path.Combine(
                           Path.Combine(gac, reference.ShortName), gac_folder.ToString()),
                       reference.ShortName + ".dll"));
        }
        ReferenceProjectItem FindReference(string name)
        {
            string referenceName = GetReferenceName(name);

            foreach (ReferenceProjectItem referenceProjectItem in project.GetItemsOfType(ItemType.Reference))
            {
                var assemblyName = new DomAssemblyName(referenceProjectItem.Include);
                if (IsMatchIgnoringCase(assemblyName.ShortName, referenceName))
                {
                    return(referenceProjectItem);
                }
            }
            return(null);
        }
예제 #13
0
		public FileName FindAssembly(DomAssemblyName fullName)
		{
			FileName foundFileName = null;
			// Run through all searchers until we find something
			foreach (var searcher in searcherList) {
				if (searcher != null) {
					foundFileName = searcher.FindAssembly(fullName);
					if (foundFileName != null)
						break;
				}
			}
			
			return foundFileName;
		}
예제 #14
0
        void PrintCache()
        {
            IList <DomAssemblyName> cacheContent = GetCacheContent();

            List <ListViewItem> itemList = new List <ListViewItem>();

            // Create full item list
            foreach (DomAssemblyName asm in cacheContent)
            {
                ListViewItem item = new ListViewItem(new string[] { asm.ShortName, asm.Version });
                item.Tag = asm;
                itemList.Add(item);
            }
            fullItemList = itemList.ToArray();

            // Create short item list (without multiple versions)
            itemList.Clear();
            for (int i = 0; i < cacheContent.Count; i++)
            {
                DomAssemblyName asm         = cacheContent[i];
                bool            isDuplicate = false;
                for (int j = 0; j < itemList.Count; j++)
                {
                    if (string.Equals(asm.ShortName, itemList[j].Text, StringComparison.OrdinalIgnoreCase))
                    {
                        itemList[j].SubItems[1].Text += "/" + asm.Version;
                        isDuplicate = true;
                        break;
                    }
                }
                if (!isDuplicate)
                {
                    ListViewItem item = new ListViewItem(new string[] { asm.ShortName, asm.Version });
                    item.Tag = asm;
                    itemList.Add(item);
                }
            }

            shortItemList = itemList.ToArray();

            listView.Items.AddRange(shortItemList);

            Thread resolveVersionsThread = new Thread(ResolveVersionsWorker);

            resolveVersionsThread.SetApartmentState(ApartmentState.STA);
            resolveVersionsThread.IsBackground = true;
            resolveVersionsThread.Name         = "resolveVersionsThread";
            resolveVersionsThread.Priority     = ThreadPriority.BelowNormal;
            resolveVersionsThread.Start();
        }
        string ResolveAssemblyFromGac(string assemblyReference)
        {
            var             assemblyName      = new DomAssemblyName(assemblyReference);
            DomAssemblyName foundAssemblyName = gac.FindBestMatchingAssemblyName(assemblyName);

            if (foundAssemblyName != null)
            {
                FileName fileName = gac.FindAssemblyInNetGac(foundAssemblyName);
                if (fileName != null)
                {
                    return(fileName.ToString());
                }
            }
            return(null);
        }
        /// <summary>
        /// Gets the file name for an assembly stored in the GAC.
        /// </summary>
        public FileName FindAssemblyInNetGac(DomAssemblyName reference)
        {
            // without public key, it can't be in the GAC
            if (reference.PublicKeyToken == null)
                return null;

            for (int iext = 0; iext < extensions.Length; iext++) {
                for (int ipath = 0; ipath < gac_paths.Length; ipath++) {
                    for (int igac = 0; igac < gacs.Length; igac++) {
                        var gac = Path.Combine (gac_paths[ipath], gacs[igac]);
                        var file = GetAssemblyFile (reference, prefixes[ipath], gac, extensions[iext]);
                        if (File.Exists (file))
                            return FileName.Create(file);
                    }
                }
            }

            return null;
        }
        public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, DomAssemblyName[] referencedAssemblies, ProjectContentRegistry registry)
        {
            if (assemblyFullName == null)
                throw new ArgumentNullException("assemblyFullName");
            if (assemblyLocation == null)
                throw new ArgumentNullException("assemblyLocation");
            if (registry == null)
                throw new ArgumentNullException("registry");

            this.registry = registry;
            this.assemblyFullName = assemblyFullName;
            this.referencedAssemblyNames = referencedAssemblies;
            this.assemblyLocation = assemblyLocation;
            this.assemblyCompilationUnit = new DefaultCompilationUnit(this);

            try {
                assemblyFileLastWriteTime = File.GetLastWriteTimeUtc(assemblyLocation);
            } catch (Exception ex) {
                LoggingService.Warn(ex);
            }

            string fileName = XmlDoc.LookupLocalizedXmlDoc(assemblyLocation);
            if (fileName == null) {
                // Not found -> look in other directories:
                foreach (string testDirectory in XmlDoc.XmlDocLookupDirectories) {
                    fileName = XmlDoc.LookupLocalizedXmlDoc(Path.Combine(testDirectory, Path.GetFileName(assemblyLocation)));
                    if (fileName != null)
                        break;
                }
            }

            if (fileName != null) {
                if (ProjectContentRegistry.persistence != null) {
                    this.XmlDoc = XmlDoc.Load(fileName, Path.Combine(ProjectContentRegistry.persistence.CacheDirectory, "XmlDoc"));
                } else {
                    this.XmlDoc = XmlDoc.Load(fileName, null);
                }
            }
        }
예제 #18
0
        /// <summary>
        /// Gets the file name for an assembly stored in the GAC.
        /// </summary>
        public static string FindAssemblyInNetGac(DomAssemblyName reference)
        {
            // without public key, it can't be in the GAC
            if (reference.PublicKeyToken == null)
            {
                return(null);
            }

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < gacs.Length; j++)
                {
                    var gac  = Path.Combine(gac_paths [i], gacs [j]);
                    var file = GetAssemblyFile(reference, prefixes [i], gac);
                    if (File.Exists(file))
                    {
                        return(file);
                    }
                }
            }

            return(null);
        }
		/// <summary>
		/// Gets the file name for an assembly stored in the GAC.
		/// </summary>
		public FileName FindAssemblyInNetGac (DomAssemblyName reference)
		{
			// without public key, it can't be in the GAC
			if (reference.PublicKeyToken == null)
				return null;
			
			for (int i = 0; i < 2; i++) {
				for (int j = 0; j < gacs.Length; j++) {
					var gac = Path.Combine (gac_paths [i], gacs [j]);
					var file = GetAssemblyFile (reference, prefixes [i], gac);
					if (File.Exists (file))
						return FileName.Create(file);
				}
			}

			return null;
		}
		public ReflectionProjectContent(string assemblyFullName, string assemblyLocation, DomAssemblyName[] referencedAssemblies, ProjectContentRegistry registry)
		{
			if (assemblyFullName == null)
				throw new ArgumentNullException("assemblyFullName");
			if (assemblyLocation == null)
				throw new ArgumentNullException("assemblyLocation");
			if (registry == null)
				throw new ArgumentNullException("registry");
			
			this.registry = registry;
			this.assemblyFullName = assemblyFullName;
			this.assemblyName = (assemblyFullName.IndexOf(',') > -1) ? assemblyFullName.Substring(0, assemblyFullName.IndexOf(',')) : assemblyFullName;
			this.referencedAssemblyNames = referencedAssemblies;
			this.assemblyLocation = assemblyLocation;
			this.assemblyCompilationUnit = new DefaultCompilationUnit(this);
			
			try {
				assemblyFileLastWriteTime = File.GetLastWriteTimeUtc(assemblyLocation);
			} catch (Exception ex) {
				LoggingService.Warn(ex);
			}
			
			string fileName = null;
			if (assemblyLocation != typeof(object).Assembly.Location) {
				// First look in the assembly's directory.
				// mscorlib is the exception, because it is loaded from the runtime directory (C:\Windows\Microsoft.NET\Framework\v4.0.30319),
				// but that might contain an outdated version of mscorlib.xml (with less documented members than the mscorlib.xml in the Reference Assemblies)
				// (at least on my machine, lots of others don't seem to have the v4.0.30319\mscorlib.xml at all).
				fileName = XmlDoc.LookupLocalizedXmlDoc(assemblyLocation);
			}
			if (fileName == null) {
				// Not found -> look in other directories:
				foreach (string testDirectory in XmlDoc.XmlDocLookupDirectories) {
					fileName = XmlDoc.LookupLocalizedXmlDoc(Path.Combine(testDirectory, Path.GetFileName(assemblyLocation)));
					if (fileName != null)
						break;
				}
			}
			
			if (fileName != null) {
				if (registry.persistence != null) {
					this.XmlDoc = XmlDoc.Load(fileName, Path.Combine(registry.persistence.CacheDirectory, "XmlDoc"));
				} else {
					this.XmlDoc = XmlDoc.Load(fileName, null);
				}
			}
		}
		protected override bool IsServerManagementVersionRequired(DomAssemblyName assemblyName)
		{
			return (assemblyName.Version.Major == 7) && (assemblyName.Version.Minor == 9);
		}
예제 #22
0
            public CecilProjectContent(string fullName, string fileName, DomAssemblyName[] referencedAssemblies,
			                           AssemblyDefinition assembly, ProjectContentRegistry registry)
                : base(fullName, fileName, referencedAssemblies, registry)
            {
                foreach (ModuleDefinition module in assembly.Modules)
                {
                    AddTypes(module.Types);
                }
                AddAttributes(this, this.AssemblyCompilationUnit.Attributes, assembly.CustomAttributes);
                InitializeSpecialClasses();
                this.AssemblyCompilationUnit.Freeze();
            }
예제 #23
0
 protected override bool IsServerManagementVersionRequired(DomAssemblyName assemblyName)
 {
     return((assemblyName.Version.Major == 7) && (assemblyName.Version.Minor == 9));
 }
			public ReflectionProjectContent ReadProjectContent(ProjectContentRegistry registry)
			{
				if (reader.ReadInt64() != FileMagic) {
					LoggingService.Warn("Read dom: wrong magic");
					return null;
				}
				if (reader.ReadInt16() != FileVersion) {
					LoggingService.Warn("Read dom: wrong version");
					return null;
				}
				string assemblyName = reader.ReadString();
				string assemblyLocation = reader.ReadString();
				long time = 0;
				try {
					time = File.GetLastWriteTimeUtc(assemblyLocation).ToFileTime();
				} catch {}
				if (reader.ReadInt64() != time) {
					LoggingService.Warn("Read dom: assembly changed since cache was created");
					return null;
				}
				DomAssemblyName[] referencedAssemblies = new DomAssemblyName[reader.ReadInt32()];
				for (int i = 0; i < referencedAssemblies.Length; i++) {
					referencedAssemblies[i] = new DomAssemblyName(reader.ReadString());
				}
				this.pc = new ReflectionProjectContent(assemblyName, assemblyLocation, referencedAssemblies, registry);
				if (ReadClasses()) {
					return pc;
				} else {
					LoggingService.Warn("Read dom: error in file (invalid control mark)");
					return null;
				}
			}
 public GacEntry(DomAssemblyName r, string fileName)
 {
     this.r        = r;
     this.fileName = fileName;
 }
예제 #26
0
 protected virtual bool IsServerManagementVersionRequired(DomAssemblyName assemblyName)
 {
     return(true);
 }
예제 #27
0
		protected virtual bool IsServerManagementVersionRequired(DomAssemblyName assemblyName)
		{
			return true;
		}
 public GacEntry(DomAssemblyName r, string fileName)
 {
     this.r = r;
     this.fileName = fileName;
 }
예제 #29
0
		public DomAssemblyNameReference(DomAssemblyName name, IAssemblySearcher searcher)
		{
			if (name == null)
				throw new ArgumentNullException("name");
			if (searcher == null)
				throw new ArgumentNullException("searcher");
			this.name = name;
			this.searcher = searcher;
		}
예제 #30
0
		static bool IsAssemblyForWebServer(WebServer webServer, DomAssemblyName assembly)
		{
			if (webServer == WebServer.IISExpress) {
				return (assembly.Version.Major == 7) && (assembly.Version.Minor == 9);
			}
			return true;
		}
예제 #31
0
        /// <summary>
        /// Search for type name.
        /// </summary>
        /// <param name="list">Array of items where to search.</param>
        /// <param name="filter">Filter to search.</param>
        /// <returns><c>true</c>, if call succeded, <c>false</c> otherwise.</returns>
        bool SearchTypesName(ListViewItem[] list, string filter)
        {
            // return null if list is null
            if (list == null)
            {
                return(false);
            }

            // return if filter is empty
            if (string.IsNullOrEmpty(filter))
            {
                resultList = list.ToList();
                return(true);
            }

            // clear result
            resultList.Clear();

            // scan the list
            for (int i = 0; i < list.Length; ++i)
            {
                ListViewItem    item = list[i];
                DomAssemblyName asm  = item.Tag as DomAssemblyName;

                // search path
                if (asm.FullName.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    resultList.Add(item);
                }
                else
                {
                    if (worker.CancellationPending)
                    {
                        return(false);
                    }

                    // search using Mono.Cecil the class/interface/structs names
                    AssemblyDefinition currentAssembly;
                    if (!assembliesCache.ContainsKey(asm.FullName))
                    {
                        try {
                            currentAssembly = resolver.Resolve(asm.FullName);
                        }
                        catch {
                            continue;
                        }
                        assembliesCache.Add(asm.FullName, currentAssembly);
                    }
                    else
                    {
                        currentAssembly = assembliesCache[asm.FullName];
                    }

                    // search types in modules
                    if (currentAssembly != null)
                    {
                        foreach (var module in currentAssembly.Modules)
                        {
                            foreach (var type in module.Types)
                            {
                                if (type.Name.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0 &&
                                    !resultList.Contains(item))
                                {
                                    resultList.Add(item);
                                }
                            }
                        }
                    }

                    // report
                    worker.ReportProgress((int)(((i * 1.0) / list.Length) * 100));
                }
            }

            return(true);
        }
		static string GetAssemblyFile (DomAssemblyName reference, string prefix, string gac)
		{
			var gac_folder = new StringBuilder ()
				.Append (prefix)
				.Append (reference.Version)
				.Append ("__");

			gac_folder.Append (reference.PublicKeyToken);

			return Path.Combine (
				Path.Combine (
					Path.Combine (gac, reference.ShortName), gac_folder.ToString ()),
				reference.ShortName + ".dll");
		}
		IProjectContent GetExistingProjectContent(IProjectContent[] existingProjectContents, DomAssemblyName fullAssemblyName)
		{
			IProjectContent content = registry.GetExistingProjectContent(fullAssemblyName);
			if (content != null) {
				return content;
			} else if (existingProjectContents.Any()) {
				return GetExistingProjectContentForShortName(existingProjectContents, fullAssemblyName.ShortName);
			}
			return null;
		}
		/// <summary>
		/// Gets the full display name of the GAC assembly of the specified short name
		/// </summary>
		public DomAssemblyName FindBestMatchingAssemblyName(DomAssemblyName reference)
		{
			string[] info;
			Version requiredVersion = reference.Version;
			string publicKey = reference.PublicKeyToken;

			IApplicationContext applicationContext = null;
			IAssemblyEnum assemblyEnum = null;
			IAssemblyName assemblyName;
			Fusion.CreateAssemblyNameObject(out assemblyName, reference.ShortName, 0, 0);
			Fusion.CreateAssemblyEnum(out assemblyEnum, null, assemblyName, 2, 0);
			List<string> names = new List<string>();

			while (assemblyEnum.GetNextAssembly(out applicationContext, out assemblyName, 0) == 0) {
				uint nChars = 0;
				assemblyName.GetDisplayName(null, ref nChars, 0);

				StringBuilder sb = new StringBuilder((int)nChars);
				assemblyName.GetDisplayName(sb, ref nChars, 0);

				string fullName = sb.ToString();
				if (publicKey != null) {
					info = fullName.Split(',');
					if (publicKey != info[3].Substring(info[3].LastIndexOf('=') + 1)) {
						// Assembly has wrong public key
						continue;
					}
				}
				names.Add(fullName);
			}
			if (names.Count == 0)
				return null;
			string best = null;
			Version bestVersion = null;
			Version currentVersion;
			if (requiredVersion != null) {
				// use assembly with lowest version higher or equal to required version
				for (int i = 0; i < names.Count; i++) {
					info = names[i].Split(',');
					currentVersion = new Version(info[1].Substring(info[1].LastIndexOf('=') + 1));
					if (currentVersion.CompareTo(requiredVersion) < 0)
						continue; // version not good enough
					if (best == null || currentVersion.CompareTo(bestVersion) < 0) {
						bestVersion = currentVersion;
						best = names[i];
					}
				}
				if (best != null)
					return new DomAssemblyName(best);
			}
			// use assembly with highest version
			best = names[0];
			info = names[0].Split(',');
			bestVersion = new Version(info[1].Substring(info[1].LastIndexOf('=') + 1));
			for (int i = 1; i < names.Count; i++) {
				info = names[i].Split(',');
				currentVersion = new Version(info[1].Substring(info[1].LastIndexOf('=') + 1));
				if (currentVersion.CompareTo(bestVersion) > 0) {
					bestVersion = currentVersion;
					best = names[i];
				}
			}
			return new DomAssemblyName(best);
		}
		public IProjectContent GetExistingProjectContent(DomAssemblyName assembly)
		{
			return GetExistingProjectContent(assembly.FullName);
		}
		static string GetVersion__Token(DomAssemblyName asmName)
		{
			StringBuilder b = new StringBuilder(asmName.Version.ToString());
			b.Append("__");
			b.Append(asmName.PublicKeyToken);
			return b.ToString();
		}
		ReferenceProjectItem FindReference(string name)
		{
			string referenceName = GetReferenceName(name);
			foreach (ReferenceProjectItem referenceProjectItem in project.GetItemsOfType(ItemType.Reference)) {
				var assemblyName = new DomAssemblyName(referenceProjectItem.Include);
				if (IsMatchIgnoringCase(assemblyName.ShortName, referenceName)) {
					return referenceProjectItem;
				}
			}
			return null;
		}