예제 #1
0
        public ITypeDefinition GetTypeDefinition(TopLevelTypeName topLevelTypeName)
        {
            var typeDefHandle = PEFile.GetTypeDefinition(topLevelTypeName);

            if (typeDefHandle.IsNil)
            {
                var forwarderHandle = PEFile.GetTypeForwarder(topLevelTypeName);
                if (!forwarderHandle.IsNil)
                {
                    var forwarder = metadata.GetExportedType(forwarderHandle);
                    return(ResolveForwardedType(forwarder).GetDefinition());
                }
            }
            return(GetDefinition(typeDefHandle));
        }
        /// <summary>
        /// Resolves the type reference within the context of the given PE file.
        /// </summary>
        /// <returns>Either TypeDefinitionHandle, if the type is defined in the module or ExportedTypeHandle,
        /// if the module contains a type forwarder. Returns a nil handle, if the type was not found.</returns>
        public EntityHandle ResolveInPEFile(PEFile module)
        {
            string[] parts = typeName.Split('.');
            for (int i = parts.Length - 1; i >= 0; i--)
            {
                string ns           = string.Join(".", parts, 0, i);
                string name         = parts[i];
                int    topLevelTPC  = (i == parts.Length - 1 ? typeParameterCount : 0);
                var    topLevelName = new TopLevelTypeName(ns, name, topLevelTPC);
                var    typeHandle   = module.GetTypeDefinition(topLevelName);

                for (int j = i + 1; j < parts.Length && !typeHandle.IsNil; j++)
                {
                    int    tpc        = (j == parts.Length - 1 ? typeParameterCount : 0);
                    var    typeDef    = module.Metadata.GetTypeDefinition(typeHandle);
                    string lookupName = parts[j] + (tpc > 0 ? "`" + tpc : "");
                    typeHandle = typeDef.GetNestedTypes().FirstOrDefault(n => IsEqualShortName(n, module.Metadata, lookupName));
                }

                if (!typeHandle.IsNil)
                {
                    return(typeHandle);
                }
                FullTypeName typeName = topLevelName;
                for (int j = i + 1; j < parts.Length; j++)
                {
                    int tpc = (j == parts.Length - 1 ? typeParameterCount : 0);
                    typeName = typeName.NestedType(parts[j], tpc);
                }

                var exportedType = module.GetTypeForwarder(typeName);
                if (!exportedType.IsNil)
                {
                    return(exportedType);
                }
            }

            return(default);