private Assembly _universe_AssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); AssemblyName previousMatch = null; int previousMatchLevel = 0; foreach (Assembly asm in _universe.GetAssemblies()) { if (Match(asm.GetName(), name, ref previousMatch, ref previousMatchLevel)) { return(asm); } } foreach (string file in FindAssemblyPath(name.Name + ".dll")) { if (Match(AssemblyName.GetAssemblyName(file), name, ref previousMatch, ref previousMatchLevel)) { return(LoadFile(file)); } } if (args.RequestingAssembly != null) { string path = Path.Combine(Path.GetDirectoryName(args.RequestingAssembly.Location), name.Name + ".dll"); if (File.Exists(path) && Match(AssemblyName.GetAssemblyName(path), name, ref previousMatch, ref previousMatchLevel)) { return(LoadFile(path)); } } string hintpath; if (_hintpaths.TryGetValue(name.FullName, out hintpath)) { string path = Path.Combine(hintpath, name.Name + ".dll"); if (File.Exists(path) && Match(AssemblyName.GetAssemblyName(path), name, ref previousMatch, ref previousMatchLevel)) { return(LoadFile(path)); } } if (previousMatch != null) { if (previousMatchLevel == 2) { ConsoleOps.Warning("assuming assembly reference '{0}' matches '{1}', you may need to supply runtime policy", previousMatch.FullName, name.FullName); return(LoadFile(new Uri(previousMatch.CodeBase).LocalPath)); } else if (args.RequestingAssembly != null) { ConsoleOps.Error(true, "Assembly '{0}' uses '{1}' which has a higher version than referenced assembly '{2}'", args.RequestingAssembly.FullName, name.FullName, previousMatch.FullName); } else { ConsoleOps.Error(true, "Assembly '{0}' was requested which is a higher version than referenced assembly '{1}'", name.FullName, previousMatch.FullName); } } else { ConsoleOps.Error(true, "unable to find assembly '{0}' {1}", args.Name, args.RequestingAssembly != null ? string.Format(" (a dependency of '{0}')", args.RequestingAssembly.FullName) : string.Empty); } return(null); }
private Assembly universe_AssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); AssemblyName previousMatch = null; int previousMatchLevel = 0; foreach (Assembly asm in universe.GetAssemblies()) { if (Match(asm.GetName(), name, ref previousMatch, ref previousMatchLevel)) { return(asm); } } foreach (string file in FindAssemblyPath(name.Name + ".dll")) { if (Match(AssemblyName.GetAssemblyName(file), name, ref previousMatch, ref previousMatchLevel)) { return(LoadFile(file)); } } if (args.RequestingAssembly != null) { string path = Path.Combine(Path.GetDirectoryName(args.RequestingAssembly.Location), name.Name + ".dll"); if (File.Exists(path) && Match(AssemblyName.GetAssemblyName(path), name, ref previousMatch, ref previousMatchLevel)) { return(LoadFile(path)); } } if (previousMatch != null) { if (previousMatchLevel == 2) { EmitWarning(WarningId.HigherVersion, "assuming assembly reference \"{0}\" matches \"{1}\", you may need to supply runtime policy", previousMatch.FullName, name.FullName); return(LoadFile(new Uri(previousMatch.CodeBase).LocalPath)); } else if (args.RequestingAssembly != null) { Console.Error.WriteLine("Error: Assembly '{0}' uses '{1}' which has a higher version than referenced assembly '{2}'", args.RequestingAssembly.FullName, name.FullName, previousMatch.FullName); } else { Console.Error.WriteLine("Error: Assembly '{0}' was requested which is a higher version than referenced assembly '{1}'", name.FullName, previousMatch.FullName); } } else { Console.Error.WriteLine("Error: unable to find assembly '{0}'", args.Name); if (args.RequestingAssembly != null) { Console.Error.WriteLine(" (a dependency of '{0}')", args.RequestingAssembly.FullName); } } Environment.Exit(1); return(null); }
private Assembly AssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); AssemblyName previousMatch = null; int previousMatchLevel = 0; foreach (Assembly asm in universe.GetAssemblies()) { if (Match(asm.GetName(), name, ref previousMatch, ref previousMatchLevel)) { return(asm); } } if (previousMatch != null) { //XXX: This is incorrect! return(universe.Load(previousMatch.FullName)); //TODO: Rework this logic /*if (previousMatchLevel == 2) * { * EmitWarning(WarningId.HigherVersion, "assuming assembly reference \"{0}\" matches \"{1}\", you may need to supply runtime policy.", previousMatch.FullName, name.FullName); * return universe.Load(previousMatch.FullName); * } * else if (args.RequestingAssembly != null) * { * Console.Error.WriteLine("Error: Assembly '{0}' uses '{1}' which has a higher version than referenced assembly '{2}'", args.RequestingAssembly.FullName, name.FullName, previousMatch.FullName); * Environment.Exit(1); * return null; * } * else * { * Console.Error.WriteLine("Error: Assembly '{0}' was requested which is a higher version than referenced assembly '{1}'", name.FullName, previousMatch.FullName); * if (args.RequestingAssembly != null) * { * Console.Error.WriteLine("Error: Request was made by the following assembly: '{0}'", args.RequestingAssembly.FullName); * } * Environment.Exit(1); * return null; * }*/ } else if (args.RequestingAssembly != null) { return(universe.CreateMissingAssembly(args.Name)); } else { return(null); } }
private Assembly AssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); AssemblyName previousMatch = null; int previousMatchLevel = 0; foreach (Assembly asm in universe.GetAssemblies()) { if (Match(asm.GetName(), name, ref previousMatch, ref previousMatchLevel)) { return(asm); } } if (previousMatch != null) { if (previousMatchLevel == 2) { #if NETFRAMEWORK EmitWarning(WarningId.HigherVersion, "assuming assembly reference \"{0}\" matches \"{1}\", you may need to supply runtime policy", previousMatch.FullName, name.FullName); #endif return(universe.Load(previousMatch.FullName)); } else if (args.RequestingAssembly != null) { Console.Error.WriteLine("Error: Assembly '{0}' uses '{1}' which has a higher version than referenced assembly '{2}'", args.RequestingAssembly.FullName, name.FullName, previousMatch.FullName); Environment.Exit(1); return(null); } else { Console.Error.WriteLine("Error: Assembly '{0}' was requested which is a higher version than referenced assembly '{1}'", name.FullName, previousMatch.FullName); Environment.Exit(1); return(null); } } else if (args.RequestingAssembly != null) { return(universe.CreateMissingAssembly(args.Name)); } else { return(null); } }
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 (version_mismatch is AssemblyBuilder) { return(version_mismatch); } var v1 = new AssemblyName(refname).Version; var v2 = version_mismatch.GetName().Version; if (v1 > v2) { if (resolved_version_mismatches == null) { resolved_version_mismatches = new Dictionary <AssemblyName, List <string[]> > (); } var an = args.RequestingAssembly.GetName(); List <string[]> names; if (!resolved_version_mismatches.TryGetValue(an, out names)) { names = new List <string[]> (); resolved_version_mismatches.Add(an, names); } names.Add(new[] { args.RequestingAssembly.Location, 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) }); return(version_mismatch); } if (!is_fx_assembly) { if (v1.Major != v2.Major || v1.Minor != v2.Minor) { compiler.Report.Warning(1701, 2, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } else { compiler.Report.Warning(1702, 3, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } } 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)); }
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 (!Fusion.CompareAssemblyIdentityPure(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 (version_mismatch is AssemblyBuilder) { return(version_mismatch); } var v1 = new AssemblyName(refname).Version; var v2 = version_mismatch.GetName().Version; if (v1 > v2) { // compiler.Report.SymbolRelatedToPreviousError (args.RequestingAssembly.Location); compiler.Report.Error(1705, "Assembly `{0}' references `{1}' which has a higher version number than imported assembly `{2}'", args.RequestingAssembly.FullName, refname, version_mismatch.GetName().FullName); return(domain.CreateMissingAssembly(args.Name)); } if (!is_fx_assembly) { if (v1.Major != v2.Major || v1.Minor != v2.Minor) { compiler.Report.Warning(1701, 2, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } else { compiler.Report.Warning(1702, 3, "Assuming assembly reference `{0}' matches assembly `{1}'. You may need to supply runtime policy", refname, version_mismatch.GetName().FullName); } } return(version_mismatch); } // AssemblyReference has not been found in the domain // create missing reference and continue return(domain.CreateMissingAssembly(args.Name)); }
private Assembly LegacyAssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { return(LegacyLoad(new AssemblyName(args.Name), args.RequestingAssembly)); }
private Assembly AssemblyResolve(object sender, IKVM.Reflection.ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); AssemblyName previousMatch = null; int previousMatchLevel = 0; foreach (Assembly asm in universe.GetAssemblies()) { if (Match(asm.GetName(), name, ref previousMatch, ref previousMatchLevel)) { if (previousMatch?.FullName != null) { if (_repeatLoadCounter.ContainsKey(previousMatch.FullName)) { _repeatLoadCounter.Remove(previousMatch.FullName); } } return(asm); } } if (previousMatch != null) { if (previousMatchLevel == 2) { EmitWarning(WarningId.HigherVersion, "assuming assembly reference \"{0}\" matches \"{1}\", you may need to supply runtime policy", previousMatch.FullName, name.FullName); if (_repeatLoadCounter.ContainsKey(previousMatch.FullName)) { _repeatLoadCounter[previousMatch.FullName]++; } else { _repeatLoadCounter.Add(previousMatch.FullName, 1); } if (_repeatLoadCounter[previousMatch.FullName] > 100) { throw new Exception("Excessive repeating load attempt detected"); } return(universe.Load(previousMatch.FullName)); } else if (args.RequestingAssembly != null) { Console.Error.WriteLine("Error: Assembly '{0}' uses '{1}' which has a higher version than referenced assembly '{2}'", args.RequestingAssembly.FullName, name.FullName, previousMatch.FullName); Environment.Exit(1); return(null); } else { Console.Error.WriteLine("Error: Assembly '{0}' was requested which is a higher version than referenced assembly '{1}'", name.FullName, previousMatch.FullName); Environment.Exit(1); return(null); } } else if (args.RequestingAssembly != null) { return(universe.CreateMissingAssembly(args.Name)); } else { return(null); } }