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; }
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; }
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; }
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); }
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; }
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); }
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; }
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); } } }
/// <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); }
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(); }
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; }
protected virtual bool IsServerManagementVersionRequired(DomAssemblyName assemblyName) { return(true); }
protected virtual bool IsServerManagementVersionRequired(DomAssemblyName assemblyName) { return true; }
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; }
static bool IsAssemblyForWebServer(WebServer webServer, DomAssemblyName assembly) { if (webServer == WebServer.IISExpress) { return (assembly.Version.Major == 7) && (assembly.Version.Minor == 9); } return true; }
/// <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; }