Example #1
0
        /// <summary>
        /// Loads the interfaces.
        /// </summary>
        protected void LoadTypeReferences()
        {
            Token maxToken = GetMaxTokenValue(TableType.TypeRef);

            foreach (Token token in new Token(TableType.TypeRef, 1).Upto(maxToken))
            {
                RuntimeType runtimeType = null;

                TypeRefRow row      = metadataProvider.ReadTypeRefRow(token);
                string     typeName = GetString(row.TypeNameIdx);

                switch (row.ResolutionScope.Table)
                {
                case TableType.Module:
                    goto case TableType.TypeRef;

                case TableType.TypeDef:
                    throw new NotImplementedException();

                case TableType.TypeRef:
                {
                    TypeRefRow row2           = metadataProvider.ReadTypeRefRow(row.ResolutionScope);
                    string     typeName2      = GetString(row2.TypeNameIdx);
                    string     typeNamespace2 = GetString(row2.TypeNamespaceIdx) + "." + typeName2;

                    AssemblyRefRow asmRefRow    = metadataProvider.ReadAssemblyRefRow(row2.ResolutionScope);
                    string         assemblyName = GetString(asmRefRow.Name);
                    ITypeModule    module       = typeSystem.ResolveModuleReference(assemblyName);
                    runtimeType = module.GetType(typeNamespace2, typeName);

                    if (runtimeType == null)
                    {
                        throw new TypeLoadException("Could not find type: " + typeNamespace2 + Type.Delimiter + typeName);
                    }

                    break;
                }

                case TableType.TypeSpec:
                    throw new NotImplementedException();

                case TableType.ModuleRef:
                    throw new NotImplementedException();

                case TableType.AssemblyRef:
                {
                    string typeNamespace = GetString(row.TypeNamespaceIdx);

                    AssemblyRefRow asmRefRow    = metadataProvider.ReadAssemblyRefRow(row.ResolutionScope);
                    string         assemblyName = GetString(asmRefRow.Name);
                    ITypeModule    module       = typeSystem.ResolveModuleReference(assemblyName);
                    runtimeType = module.GetType(typeNamespace, typeName);

                    if (runtimeType == null)
                    {
                        throw new TypeLoadException("Could not find type: " + typeNamespace + Type.Delimiter + typeName);
                    }

                    break;
                }

                default:
                    throw new NotImplementedException();
                }

                typeRef[token.RID - 1] = runtimeType;
            }
        }