private Tuple <SemanticVersion, string> ResolveAssembly(DllReference parentAssembly, AssemblyReference assemblyDependency) { var assemblies = _assemblyCacheService.Assemblies; var conflictingAssemblies = _assemblyCacheService.ConflictingAssemblies; //RULE 1. It's an assembly that is known on nuget.org or other. Official or Snapshot doesn't matter if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyUsingOfficialRepository) { var nugetPackage = _mappingService.GetNuGetPackage(_assemblyCacheService, assemblyDependency); if (nugetPackage != null) { Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found in official repository as {nugetPackage.Item2}-{nugetPackage.Item1}"); return(nugetPackage); } } //RULE 2. The reference is not known but it match with at least one dll present on local folder var resolvedAssembly = new Tuple <SemanticVersion, string>(new SemanticVersion(assemblyDependency.Item1), assemblyDependency.Item2); if (_assemblyCacheService.Assemblies.ContainsKey(resolvedAssembly) && conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) == 1) { Trace.TraceInformation($"{assemblyDependency.Item2}-{assemblyDependency.Item1} found at {assemblies[resolvedAssembly].Path}"); return(assemblies[resolvedAssembly].Id); } if (conflictingAssemblies.ContainsKey(assemblyDependency) && conflictingAssemblies[assemblyDependency].Count(_ => string.IsNullOrEmpty(_.SpecialVersion)) > 1 && _resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringMultipleAssembliesWithSameVersion) { // there might be more than one dll with the expected version...Try to find the best one... resolvedAssembly = RetrieveConflictingDependancyFromCacheOrResolve(assemblies, parentAssembly, conflictingAssemblies[assemblyDependency], assemblyDependency); } // RULE 3. Let's try to find if there is a snapshot or a equivalent Version (build number mistmatch only) if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringBuildNumber) { var resolvedpackage = CompatibleBuild(assemblyDependency, assemblies, resolvedAssembly); if (resolvedpackage != null) { return(resolvedpackage); } } // RULE 4. Let's try to find if there is Higher Version (Patch & Build only) and take it only if there is only one possibility if (_resolutionLevel != ResolutionLevelEnum.DontResolveDependancyIgnoringPatchAndBuildNumber) { var resolvedpackage = ComptiblePathAndBuild(assemblyDependency, assemblies, resolvedAssembly); if (resolvedpackage != null) { return(resolvedpackage); } } Trace.TraceError($"Unable to find dependency {assemblyDependency.Item2}, {assemblyDependency.Item1}"); if (_useCache) { _dependencies.AddUnresolvedDependencies(assemblyDependency); } return(null); }