public void VerifyInterfaces() { TypeDefinition typeDefinition = _module.MetadataReader.GetTypeDefinition(_typeDefinitionHandle); EcmaType type = (EcmaType)_module.GetType(_typeDefinitionHandle); if (type.IsInterface) { return; } InterfaceImplementationHandleCollection interfaceHandles = typeDefinition.GetInterfaceImplementations(); int count = interfaceHandles.Count; if (count == 0) { return; } VirtualMethodAlgorithm virtualMethodAlg = _typeSystemContext.GetVirtualMethodAlgorithmForType(type); List <InterfaceMetadataObjects> implementedInterfaces = new List <InterfaceMetadataObjects>(); foreach (InterfaceImplementationHandle interfaceHandle in interfaceHandles) { InterfaceImplementation interfaceImplementation = _module.MetadataReader.GetInterfaceImplementation(interfaceHandle); DefType interfaceType = _module.GetType(interfaceImplementation.Interface) as DefType; if (interfaceType == null) { ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadBadFormat, type); } InterfaceMetadataObjects imo = new InterfaceMetadataObjects { DefType = interfaceType, InterfaceImplementationHandle = interfaceHandle }; // Look for duplicates. if (!implementedInterfaces.Contains(imo)) { implementedInterfaces.Add(imo); } else { VerificationError(VerifierError.InterfaceImplHasDuplicate, type, interfaceType, _module.MetadataReader.GetToken(interfaceHandle)); } if (!type.IsAbstract) { // Look for missing method implementation foreach (MethodDesc method in imo.DefType.GetAllMethods()) { MethodDesc resolvedMethod = virtualMethodAlg.ResolveInterfaceMethodToVirtualMethodOnType(method, type); if (resolvedMethod is null) { VerificationError(VerifierError.InterfaceMethodNotImplemented, type, imo.DefType, method, _module.MetadataReader.GetToken(_typeDefinitionHandle), _module.MetadataReader.GetToken(imo.InterfaceImplementationHandle), _module.MetadataReader.GetToken(((EcmaMethod)method).Handle)); } } } } }
public void VerifyInterfaces() { TypeDefinition typeDefinition = _module.MetadataReader.GetTypeDefinition(_typeDefinitionHandle); EcmaType type = (EcmaType)_module.GetType(_typeDefinitionHandle); if (type.IsInterface) { return; } InterfaceImplementationHandleCollection interfaceHandles = typeDefinition.GetInterfaceImplementations(); int count = interfaceHandles.Count; if (count == 0) { return; } // Look for duplicates. List <InterfaceMetadataObjects> implementedInterfaces = new List <InterfaceMetadataObjects>(); foreach (InterfaceImplementationHandle interfaceHandle in interfaceHandles) { InterfaceImplementation interfaceImplementation = _module.MetadataReader.GetInterfaceImplementation(interfaceHandle); DefType interfaceType = _module.GetType(interfaceImplementation.Interface) as DefType; if (interfaceType == null) { ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadBadFormat, type); } InterfaceMetadataObjects imo = new InterfaceMetadataObjects { DefType = interfaceType, InterfaceImplementationHandle = interfaceHandle }; if (!implementedInterfaces.Contains(imo)) { implementedInterfaces.Add(imo); } else { VerificationError(VerifierError.InterfaceImplHasDuplicate, type, interfaceType, _module.MetadataReader.GetToken(interfaceHandle)); } } // Other check }
public void VerifyInterfaces() { TypeDefinition typeDefinition = _module.MetadataReader.GetTypeDefinition(_typeDefinitionHandle); EcmaType type = (EcmaType)_module.GetType(_typeDefinitionHandle); if (type.IsInterface) { return; } InterfaceImplementationHandleCollection interfaceHandles = typeDefinition.GetInterfaceImplementations(); int count = interfaceHandles.Count; if (count == 0) { return; } // Look for duplicates and prepare distinct list of implemented interfaces to avoid // subsequent error duplication List <InterfaceMetadataObjects> implementedInterfaces = new List <InterfaceMetadataObjects>(); foreach (InterfaceImplementationHandle interfaceHandle in interfaceHandles) { InterfaceImplementation interfaceImplementation = _module.MetadataReader.GetInterfaceImplementation(interfaceHandle); TypeDesc interfaceTypeDesc = _module.GetType(interfaceImplementation.Interface) as TypeDesc; if (interfaceTypeDesc == null) { ThrowHelper.ThrowTypeLoadException(ExceptionStringID.ClassLoadBadFormat, type); } InterfaceMetadataObjects imo = new InterfaceMetadataObjects { InterfaceType = interfaceTypeDesc, InterfaceImplementation = interfaceImplementation }; if (!implementedInterfaces.Contains(imo)) { implementedInterfaces.Add(imo); } else { VerificationError(VerifierError.InterfaceImplHasDuplicate, Format(type), Format(imo.InterfaceType, _module, imo.InterfaceImplementation)); } } foreach (InterfaceMetadataObjects implementedInterface in implementedInterfaces) { if (!type.IsAbstract) { // Look for missing method implementation foreach (MethodDesc method in implementedInterface.InterfaceType.GetAllMethods()) { if (!method.IsAbstract) { continue; } MethodDesc resolvedMethod = type.ResolveInterfaceMethodTarget(method); if (resolvedMethod is null) { VerificationError(VerifierError.InterfaceMethodNotImplemented, Format(type), Format(implementedInterface.InterfaceType, _module, implementedInterface.InterfaceImplementation), Format(method)); } } } } }