IEnumerable <PreconfiguredAssemblyList> ResolvePreconfiguredAssemblyLists() { yield return(new PreconfiguredAssemblyList(DotNet4List)); yield return(new PreconfiguredAssemblyList(DotNet35List)); yield return(new PreconfiguredAssemblyList(ASPDotNetMVC3List)); var basePath = DotNetCorePathFinder.FindDotNetExeDirectory(); if (basePath == null) { yield break; } Dictionary <string, string> foundVersions = new Dictionary <string, string>(); Dictionary <string, int> latestRevision = new Dictionary <string, int>(); foreach (var sdkDir in Directory.GetDirectories(Path.Combine(basePath, "shared"))) { if (sdkDir.EndsWith(".Ref", StringComparison.OrdinalIgnoreCase)) { continue; } foreach (var versionDir in Directory.GetDirectories(sdkDir)) { var match = Regex.Match(versionDir, @"[/\\](?<name>[A-z0-9.]+)[/\\](?<version>\d+\.\d)+(.(?<revision>\d+))?$"); if (!match.Success) { continue; } string name = match.Groups["name"].Value; int index = name.LastIndexOfAny(new[] { '/', '\\' }); if (index >= 0) { name = name.Substring(index + 1); } string text = name + " " + match.Groups["version"].Value; if (!latestRevision.TryGetValue(text, out int revision)) { revision = -1; } int newRevision = int.Parse(match.Groups["revision"].Value); if (newRevision > revision) { latestRevision[text] = newRevision; foundVersions[text] = versionDir; } } } foreach (var pair in foundVersions) { yield return(new PreconfiguredAssemblyList(pair.Key + "(." + latestRevision[pair.Key] + ")", pair.Value)); } }
public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) { try { var targetFramework = TargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None); string file = null; switch (targetFramework[0]) { case ".NETCoreApp": case ".NETStandard": if (targetFramework.Length != 2) { goto default; } if (dotNetCorePathFinder == null) { var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1]; dotNetCorePathFinder = new DotNetCorePathFinder(assemblyFileName, TargetFramework, version, this.loadedAssemblyReferences); } file = dotNetCorePathFinder.TryResolveDotNetCore(name); if (file == null) { string dir = Path.GetDirectoryName(assemblyFileName); if (File.Exists(Path.Combine(dir, name.Name + ".dll"))) { file = Path.Combine(dir, name.Name + ".dll"); } else if (File.Exists(Path.Combine(dir, name.Name + ".exe"))) { file = Path.Combine(dir, name.Name + ".exe"); } } if (file == null) { return(base.Resolve(name, parameters)); } else { return(ModuleDefinition.ReadModule(file, parameters).Assembly); } default: return(base.Resolve(name, parameters)); } } catch (AssemblyResolutionException exception) { System.Console.WriteLine(exception.ToString()); return(null); } }
public static string FindAssemblyFile(AssemblyDefinition assemblyDefinition, string assemblyFile) { var assemblyName = assemblyDefinition.Name; var detectedTargetFramework = assemblyDefinition.DetectTargetFrameworkId(assemblyFile); if (string.IsNullOrEmpty(detectedTargetFramework)) { // Without a target framework id it makes no sense to continue return(null); } var targetFramework = detectedTargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None); string file = null; switch (targetFramework[0]) { case ".NETCoreApp": case ".NETStandard": if (targetFramework.Length != 2) { return(FindAssemblyFromGAC(assemblyDefinition)); } var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1]; var dotNetCorePathFinder = new DotNetCorePathFinder(assemblyFile, detectedTargetFramework, version); file = dotNetCorePathFinder.TryResolveDotNetCore(assemblyName); if (file != null) { return(file); } return(FindAssemblyFromGAC(assemblyDefinition)); default: return(FindAssemblyFromGAC(assemblyDefinition)); } }
LoadedAssembly LookupReferencedAssemblyInternal(string fullName) { foreach (LoadedAssembly asm in assemblyList.GetAssemblies()) { if (asm.AssemblyDefinition != null && fullName.Equals(asm.AssemblyDefinition.FullName, StringComparison.OrdinalIgnoreCase)) { return(asm); } } if (assemblyLoadDisableCount > 0) { return(null); } if (!App.Current.Dispatcher.CheckAccess()) { // Call this method on the GUI thread. return((LoadedAssembly)App.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Func <string, LoadedAssembly>(LookupReferencedAssembly), fullName)); } var targetFramework = TargetFrameworkId.Split(new[] { ",Version=v" }, StringSplitOptions.None); var name = AssemblyNameReference.Parse(fullName); string file = null; switch (targetFramework[0]) { case ".NETCoreApp": case ".NETStandard": if (targetFramework.Length != 2) { break; } if (dotNetCorePathFinder == null) { var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1]; dotNetCorePathFinder = new DotNetCorePathFinder(fileName, TargetFrameworkId, version, this.loadedAssemblyReferences); } file = dotNetCorePathFinder.TryResolveDotNetCore(name); break; default: file = GacInterop.FindAssemblyInNetGac(name); break; } if (file == null) { string dir = Path.GetDirectoryName(this.fileName); if (File.Exists(Path.Combine(dir, name.Name + ".dll"))) { file = Path.Combine(dir, name.Name + ".dll"); } else if (File.Exists(Path.Combine(dir, name.Name + ".exe"))) { file = Path.Combine(dir, name.Name + ".exe"); } } if (file != null) { loadedAssemblyReferences.AddMessage(fullName, MessageKind.Info, "Success - Loading from: " + file); return(assemblyList.OpenAssembly(file, true)); } else { loadedAssemblyReferences.AddMessage(fullName, MessageKind.Error, "Could not find reference: " + fullName); return(null); } }