void AddReferenceVersionMismatch(AssemblyName an, AssemblyReferenceMessageInfo errorInfo) { if (resolved_version_mismatches == null) { resolved_version_mismatches = new Dictionary <AssemblyName, List <AssemblyReferenceMessageInfo> > (); } List <AssemblyReferenceMessageInfo> names; if (!resolved_version_mismatches.TryGetValue(an, out names)) { names = new List <AssemblyReferenceMessageInfo> (); resolved_version_mismatches.Add(an, names); } names.Add(errorInfo); }
Assembly AssemblyReferenceResolver(object sender, IKVM.Reflection.ResolveEventArgs args) { var refname = args.Name; if (refname == "mscorlib") { return(corlib); } Assembly version_mismatch = null; bool is_fx_assembly = false; foreach (var assembly in domain.GetAssemblies()) { AssemblyComparisonResult result; if (!domain.CompareAssemblyIdentity(refname, false, assembly.FullName, false, out result)) { if ((result == AssemblyComparisonResult.NonEquivalentVersion || result == AssemblyComparisonResult.NonEquivalentPartialVersion) && (version_mismatch == null || version_mismatch.GetName().Version < assembly.GetName().Version) && !is_fx_assembly) { version_mismatch = assembly; } continue; } if (result == AssemblyComparisonResult.EquivalentFullMatch || result == AssemblyComparisonResult.EquivalentWeakNamed || result == AssemblyComparisonResult.EquivalentPartialMatch) { return(assembly); } if (result == AssemblyComparisonResult.EquivalentFXUnified) { is_fx_assembly = true; if (version_mismatch == null || version_mismatch.GetName().Version < assembly.GetName().Version) { version_mismatch = assembly; } continue; } throw new NotImplementedException("Assembly equality = " + result.ToString()); } if (version_mismatch != null) { if (is_fx_assembly || version_mismatch is AssemblyBuilder) { return(version_mismatch); } var ref_an = new AssemblyName(refname); var v1 = ref_an.Version; var v2 = version_mismatch.GetName().Version; AssemblyReferenceMessageInfo messageInfo; if (v1 > v2) { messageInfo = new AssemblyReferenceMessageInfo(ref_an, report => { report.SymbolRelatedToPreviousError(args.RequestingAssembly.Location); report.Error(1705, string.Format("Assembly `{0}' depends on `{1}' which has a higher version number than referenced assembly `{2}'", args.RequestingAssembly.FullName, refname, version_mismatch.GetName().FullName)); }); } else { messageInfo = new AssemblyReferenceMessageInfo(ref_an, report => { if (v1.Major != v2.Major || v1.Minor != v2.Minor) { report.Warning(1701, 2, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } else { report.Warning(1702, 3, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } }); } AddReferenceVersionMismatch(args.RequestingAssembly.GetName(), messageInfo); return(version_mismatch); } // // Recursive reference to compiled assembly checks name only. Any other // details (PublicKey, Version, etc) are not yet known hence cannot be checked // ParsedAssemblyName referenced_assembly; if (Fusion.ParseAssemblyName(args.Name, out referenced_assembly) == ParseAssemblyResult.OK && CompiledAssembly.Name == referenced_assembly.Name) { return(CompiledAssembly.Builder); } // AssemblyReference has not been found in the domain // create missing reference and continue return(domain.CreateMissingAssembly(args.Name)); }