private Tuple<SemanticVersion, string> CreateAssembly(SortedDictionary<Tuple<SemanticVersion, string>, DllReference> cache, string dll, string frameworkVersionName, FileAssemblyVersion mainAssemblyId, IEnumerable<AssemblyReference> assemblyReferences) { Trace.TraceInformation($"ADDED : Assembly {mainAssemblyId.Item2}, {mainAssemblyId.Item1}"); //For a specific version (Version+Name) it might exist multiple real File (SemanticVersion+Name) //For exampl snapshot. We store them here will see later which one to choose var assemblyId = new Tuple<Version, string>(mainAssemblyId.AssemblyVersion, mainAssemblyId.Item2); if (!ConflictingAssemblies.ContainsKey(assemblyId)) ConflictingAssemblies.Add(assemblyId, new /**/ SortedSet<SemanticVersion>()); ConflictingAssemblies[assemblyId].Add(mainAssemblyId.Item1); // While adding references we ignore assembly in the GAC cache.Add(mainAssemblyId, new /**/ DllReference(dll, frameworkVersionName, mainAssemblyId, assemblyReferences.Where( _ => !GacUtil.IsFullNameAssemblyInGAC(_.FullName)))); return cache[mainAssemblyId].Id; }
private Tuple<SemanticVersion, string> UpdateAssembly(SortedDictionary<Tuple<SemanticVersion, string>, DllReference> cache, string dll, string frameworkVersion, FileAssemblyVersion mainAssemblyId, IEnumerable<AssemblyReference> assemblyReferences) { //Not the same path, but it seems more correct as AssemblyName match dll name if (cache.ContainsKey(mainAssemblyId) && !mainAssemblyId.Item2.Equals(Path.GetFileNameWithoutExtension(cache[mainAssemblyId].Path)) && mainAssemblyId.Item2.Equals(Path.GetFileNameWithoutExtension(dll))) { Trace.TraceInformation($"UPDATE : {mainAssemblyId.Item2}, {mainAssemblyId.Item1} found in {dll} replace {cache[mainAssemblyId].Path} as assembly name match dll name"); cache[mainAssemblyId].Path = dll; } //Not the same path, ignore it else if(cache.ContainsKey(mainAssemblyId) && !dll.Equals(cache[mainAssemblyId].Path, StringComparison.OrdinalIgnoreCase)) { Trace.TraceInformation($"IGNORE : {mainAssemblyId.Item2}, {mainAssemblyId.Item1} found in {dll} already registered from {cache[mainAssemblyId].Path}"); return cache[mainAssemblyId].Id; } var assembly = cache[mainAssemblyId]; //We never know it might need updated. let's do it everytime assembly.FrameworkVersion = frameworkVersion; //Update References if References Changed var newReferences = assemblyReferences.Where(_ => !GacUtil.IsFullNameAssemblyInGAC(_.FullName)); if (!newReferences.All(_ => Enumerable.Contains(cache[mainAssemblyId].AssemblyReferences, _))) { Trace.TraceInformation($"UPDATE : Dependencies for {mainAssemblyId.Item2}, {mainAssemblyId.Item1} has changed"); cache[mainAssemblyId].AssemblyReferences = newReferences; } return assembly.Id; }
private Tuple<SemanticVersion, string> CreateOrUpdateAssembly(SortedDictionary<Tuple<SemanticVersion, string>, DllReference> cache, string dll, string frameworkVersionName, FileAssemblyVersion mainAssemblyId, IEnumerable<AssemblyReference> assemblyReferences) { if (cache.ContainsKey(mainAssemblyId)) return UpdateAssembly(cache, dll, frameworkVersionName, mainAssemblyId, assemblyReferences); return CreateAssembly(cache, dll, frameworkVersionName, mainAssemblyId, assemblyReferences); }