Exemplo n.º 1
0
Arquivo: ikvm.cs Projeto: kkdevs/mcs
        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);
        }
Exemplo n.º 2
0
Arquivo: ikvm.cs Projeto: kkdevs/mcs
        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));
        }