Esempio n. 1
0
File: ikvm.cs Progetto: nuxleus/mono
        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));
        }