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); }
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 });
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())); }
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); }