Exemple #1
0
        public TypeReference ResolveTypeName(string typeNameString)
        {
            if (string.IsNullOrEmpty(typeNameString))
            {
                return(null);
            }

            TypeName parsedTypeName;

            try {
                parsedTypeName = TypeParser.ParseTypeName(typeNameString);
            } catch (ArgumentException) {
                return(null);
            } catch (System.IO.FileLoadException) {
                return(null);
            }

            if (parsedTypeName is AssemblyQualifiedTypeName assemblyQualifiedTypeName)
            {
                AssemblyDefinition assembly = _context.GetLoadedAssembly(assemblyQualifiedTypeName.AssemblyName.Name);
                return(ResolveTypeName(assembly, assemblyQualifiedTypeName.TypeName));
            }

            foreach (var assemblyDefiniton in _context.GetAssemblies())
            {
                var foundType = ResolveTypeName(assemblyDefiniton, parsedTypeName);
                if (foundType != null)
                {
                    return(foundType);
                }
            }

            return(null);
        }
Exemple #2
0
        TypeReference ResolveTypeName(AssemblyDefinition assembly, TypeName typeName)
        {
            if (typeName is AssemblyQualifiedTypeName assemblyQualifiedTypeName)
            {
                // In this case we ignore the assembly parameter since the type name has assembly in it
                var assemblyFromName = _context.GetLoadedAssembly(assemblyQualifiedTypeName.AssemblyName.Name);
                return(ResolveTypeName(assemblyFromName, assemblyQualifiedTypeName.TypeName));
            }

            if (assembly == null || typeName == null)
            {
                return(null);
            }

            if (typeName is ConstructedGenericTypeName constructedGenericTypeName)
            {
                var genericTypeRef = ResolveTypeName(assembly, constructedGenericTypeName.GenericType);
                if (genericTypeRef == null)
                {
                    return(null);
                }

                TypeDefinition genericType         = genericTypeRef.Resolve();
                var            genericInstanceType = new GenericInstanceType(genericType);
                foreach (var arg in constructedGenericTypeName.GenericArguments)
                {
                    var genericArgument = ResolveTypeName(assembly, arg);
                    if (genericArgument == null)
                    {
                        return(null);
                    }

                    genericInstanceType.GenericArguments.Add(genericArgument);
                }

                return(genericInstanceType);
            }
            else if (typeName is HasElementTypeName elementTypeName)
            {
                var elementType = ResolveTypeName(assembly, elementTypeName.ElementTypeName);
                if (elementType == null)
                {
                    return(null);
                }

                return(typeName switch
                {
                    ArrayTypeName _ => new ArrayType(elementType),
                    MultiDimArrayTypeName multiDimArrayTypeName => new ArrayType(elementType, multiDimArrayTypeName.Rank),
                    ByRefTypeName _ => new ByReferenceType(elementType),
                    PointerTypeName _ => new PointerType(elementType),
                    _ => elementType
                });
Exemple #3
0
        TypeReference ResolveTypeName(AssemblyDefinition assembly, TypeName typeName)
        {
            if (typeName is AssemblyQualifiedTypeName assemblyQualifiedTypeName)
            {
                // In this case we ignore the assembly parameter since the type name has assembly in it
                var assemblyFromName = _context.GetLoadedAssembly(assemblyQualifiedTypeName.AssemblyName.Name);
                return(ResolveTypeName(assemblyFromName, assemblyQualifiedTypeName.TypeName));
            }

            if (assembly == null || typeName == null)
            {
                return(null);
            }

            if (typeName is ConstructedGenericTypeName constructedGenericTypeName)
            {
                var genericTypeRef = ResolveTypeName(assembly, constructedGenericTypeName.GenericType);
                if (genericTypeRef == null)
                {
                    return(null);
                }

                TypeDefinition genericType         = genericTypeRef.Resolve();
                var            genericInstanceType = new GenericInstanceType(genericType);
                foreach (var arg in constructedGenericTypeName.GenericArguments)
                {
                    var genericArgument = ResolveTypeName(assembly, arg);
                    if (genericArgument == null)
                    {
                        return(null);
                    }

                    genericInstanceType.GenericArguments.Add(genericArgument);
                }

                return(genericInstanceType);
            }
            else if (typeName is HasElementTypeName elementTypeName)
            {
                var elementType = ResolveTypeName(assembly, elementTypeName.ElementTypeName);
                if (elementType == null)
                {
                    return(null);
                }

                return(elementType);
            }

            return(assembly.MainModule.GetType(typeName.ToString()));
        }
Exemple #4
0
        public static TypeDefinition FindPredefinedType(string ns, string name, LinkContext context)
        {
            foreach (var corlibName in corlibNames)
            {
                AssemblyDefinition corlib = context.GetLoadedAssembly(corlibName);
                if (corlib == null)
                {
                    continue;
                }

                TypeDefinition type = corlib.MainModule.GetType(ns, name);
                // The assembly could be a facade with type forwarders, in which case we don't find the type in this assembly.
                if (type != null)
                {
                    return(type);
                }
            }

            return(null);
        }