public void field(MetadataVarType type) { int size; switch (type) { case MetadataVarType.byte1: size = 1; break; case MetadataVarType.byte2: size = 2; break; case MetadataVarType.byte4: size = 4; break; case MetadataVarType.stringIndex: size = (heapOffsetSizes & 1) != 0 ? 4 : 2; break; case MetadataVarType.guidIndex: size = (heapOffsetSizes & 2) != 0 ? 4 : 2; break; case MetadataVarType.blobIndex: size = (heapOffsetSizes & 4) != 0 ? 4 : 2; break; case MetadataVarType.resolutionScope: size = getSize(14, new MetadataIndex[] { MetadataIndex.iModule, MetadataIndex.iModuleRef, MetadataIndex.iAssemblyRef, MetadataIndex.iTypeRef }); break; case MetadataVarType.typeDefOrRef: size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iTypeSpec }); break; case MetadataVarType.memberRefParent: size = getSize(13, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iTypeRef, MetadataIndex.iModuleRef, MetadataIndex.iMethodDef, MetadataIndex.iTypeSpec }); break; case MetadataVarType.hasConstant: size = getSize(14, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam, MetadataIndex.iProperty }); break; case MetadataVarType.hasCustomAttribute: size = getSize(11, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iField, MetadataIndex.iTypeRef, MetadataIndex.iTypeDef, MetadataIndex.iParam, MetadataIndex.iInterfaceImpl, MetadataIndex.iMemberRef, MetadataIndex.iModule /*TODO:, MetadataIndex.iPermission*/, MetadataIndex.iProperty, MetadataIndex.iEvent, MetadataIndex.iStandAloneSig, MetadataIndex.iModuleRef, MetadataIndex.iTypeSpec, MetadataIndex.iAssembly, MetadataIndex.iAssemblyRef, MetadataIndex.iFile, MetadataIndex.iExportedType, MetadataIndex.iManifestResource, }); break; case MetadataVarType.customAttributeType: size = getSize(13, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef }); // others aren't used break; case MetadataVarType.hasFieldMarshal: size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iParam }); break; case MetadataVarType.hasDeclSecurity: size = getSize(14, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef, MetadataIndex.iAssembly }); break; case MetadataVarType.hasSemantics: size = getSize(15, new MetadataIndex[] { MetadataIndex.iEvent, MetadataIndex.iProperty }); break; case MetadataVarType.methodDefOrRef: size = getSize(15, new MetadataIndex[] { MetadataIndex.iMethodDef, MetadataIndex.iMemberRef }); break; case MetadataVarType.memberForwarded: size = getSize(15, new MetadataIndex[] { MetadataIndex.iField, MetadataIndex.iMethodDef }); break; case MetadataVarType.implementation: size = getSize(14, new MetadataIndex[] { MetadataIndex.iFile, MetadataIndex.iAssemblyRef, MetadataIndex.iExportedType }); break; case MetadataVarType.typeOrMethodDef: size = getSize(15, new MetadataIndex[] { MetadataIndex.iTypeDef, MetadataIndex.iMethodDef }); break; case MetadataVarType.fieldIndex: size = getSize(MetadataIndex.iField); break; case MetadataVarType.methodDefIndex: size = getSize(MetadataIndex.iMethodDef); break; case MetadataVarType.paramIndex: size = getSize(MetadataIndex.iParam); break; case MetadataVarType.typeDefIndex: size = getSize(MetadataIndex.iTypeDef); break; case MetadataVarType.eventIndex: size = getSize(MetadataIndex.iEvent); break; case MetadataVarType.propertyIndex: size = getSize(MetadataIndex.iProperty); break; case MetadataVarType.moduleRefIndex: size = getSize(MetadataIndex.iModuleRef); break; case MetadataVarType.assemblyRefIndex: size = getSize(MetadataIndex.iAssemblyRef); break; case MetadataVarType.genericParamIndex: size = getSize(MetadataIndex.iGenericParam); break; default: throw new ApplicationException("Unknown type"); } var field = new MetadataField(); field.offset = offset; field.size = size; fields.Add(field); offset += size; }