示例#1
0
        internal CoreTypes(MetadataLoadContext loader, string coreAssemblyName)
        {
            int numCoreTypes = (int)CoreType.NumCoreTypes;

            RoType[]    coreTypes    = new RoType[numCoreTypes];
            Exception[] exceptions   = new Exception[numCoreTypes];
            RoAssembly  coreAssembly = loader.TryGetCoreAssembly(coreAssemblyName, out Exception e);

            if (coreAssembly == null)
            {
                // If the core assembly was not found, don't continue.
                throw e;
            }
            else
            {
                for (int i = 0; i < numCoreTypes; i++)
                {
                    ((CoreType)i).GetFullName(out byte[] ns, out byte[] name);
                    RoType type = coreAssembly.GetTypeCore(ns, name, ignoreCase: false, out e);
                    coreTypes[i] = type;
                    if (type == null)
                    {
                        exceptions[i] = e;
                    }
                }
            }
            _coreTypes  = coreTypes;
            _exceptions = exceptions;
        }
        /// <summary>
        /// Helper routine for the more general Module.GetType() family of apis. Also used in typeRef resolution.
        ///
        /// Resolves top-level named types only. No nested types. No constructed types. The input name must not be escaped.
        ///
        /// If a type is not contained or forwarded from the assembly, this method returns null (does not throw.)
        /// This supports the "throwOnError: false" behavior of Module.GetType(string, bool).
        /// </summary>
        protected sealed override RoDefinitionType GetTypeCoreNoCache(ReadOnlySpan <byte> ns, ReadOnlySpan <byte> name, out Exception e)
        {
            MetadataReader reader = Reader;

            // Look through types declared in the manifest module.
            foreach (TypeDefinitionHandle h in reader.TypeDefinitions)
            {
                TypeDefinition td = h.GetTypeDefinition(reader);
                if (td.IsNested)
                {
                    continue;  // GetTypeCore() is never asked to look for nested types.
                }
                if (!(td.Name.Equals(name, reader)))
                {
                    continue;
                }
                if (!(td.Namespace.Equals(ns, reader)))
                {
                    continue;
                }

                e = null;
                return(h.ResolveTypeDef(this));
            }

            // Look for forwarded types.
            foreach (ExportedTypeHandle h in reader.ExportedTypes)
            {
                ExportedType et = h.GetExportedType(reader);
                if (!et.IsForwarder)
                {
                    continue;
                }

                EntityHandle implementation = et.Implementation;
                if (implementation.Kind != HandleKind.AssemblyReference) // This check also weeds out nested types. This is intentional.
                {
                    continue;
                }

                if (!(et.Name.Equals(name, reader)))
                {
                    continue;
                }

                if (!(et.Namespace.Equals(ns, reader)))
                {
                    continue;
                }

                RoAssembly assembly = ((AssemblyReferenceHandle)implementation).TryResolveAssembly(this, out e);
                return(assembly?.GetTypeCore(ns, name, ignoreCase: false, out e));
            }

            e = new TypeLoadException(SR.Format(SR.TypeNotFound, ns.ToUtf16().AppendTypeName(name.ToUtf16()), FullyQualifiedName));
            return(null);
        }