62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using Mono.Cecil; | ||
|  | using Mono.Cecil.Rocks; | ||
|  | 
 | ||
|  | namespace UnrealSharpWeaver.Utilities; | ||
|  | 
 | ||
|  | public static class AssemblyUtilities | ||
|  | { | ||
|  |     public static TypeReference? FindGenericType(this AssemblyDefinition assembly, string typeNamespace, string typeName, TypeReference[] typeParameters, bool bThrowOnException = true) | ||
|  |     { | ||
|  |         TypeReference? typeRef = FindType(assembly, typeName, typeNamespace, bThrowOnException); | ||
|  |         return typeRef == null ? null : typeRef.Resolve().MakeGenericInstanceType(typeParameters).ImportType(); | ||
|  |     } | ||
|  | 
 | ||
|  |     public static TypeReference? FindType(this AssemblyDefinition assembly, string typeName, string typeNamespace = "", bool throwOnException = true) | ||
|  |     { | ||
|  |         foreach (var module in assembly.Modules) | ||
|  |         { | ||
|  |             foreach (var type in module.GetAllTypes()) | ||
|  |             { | ||
|  |                 if ((typeNamespace.Length > 0 && type.Namespace != typeNamespace) || type.Name != typeName) | ||
|  |                 { | ||
|  |                     continue; | ||
|  |                 } | ||
|  |                  | ||
|  |                 return type.ImportType(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         if (throwOnException) | ||
|  |         { | ||
|  |             throw new TypeAccessException($"Type \"{typeNamespace}.{typeName}\" not found in userAssembly {assembly.Name}"); | ||
|  |         } | ||
|  | 
 | ||
|  |         return null; | ||
|  |     } | ||
|  |      | ||
|  |     public static TypeDefinition CreateNewClass(this AssemblyDefinition assembly, string classNamespace, string className, TypeAttributes attributes, TypeReference? parentClass = null) | ||
|  |     { | ||
|  |         if (parentClass == null) | ||
|  |         { | ||
|  |             parentClass = assembly.MainModule.TypeSystem.Object; | ||
|  |         } | ||
|  |          | ||
|  |         TypeDefinition newType = new TypeDefinition(classNamespace, className, attributes, parentClass); | ||
|  |         assembly.MainModule.Types.Add(newType); | ||
|  |         return newType; | ||
|  |     } | ||
|  |      | ||
|  |     public static void ForEachAssembly(Func<AssemblyDefinition, bool> action) | ||
|  |     { | ||
|  |         List<AssemblyDefinition> assemblies = [WeaverImporter.Instance.UnrealSharpAssembly, WeaverImporter.Instance.UnrealSharpCoreAssembly]; | ||
|  |         assemblies.AddRange(WeaverImporter.Instance.AllProjectAssemblies); | ||
|  |          | ||
|  |         foreach (AssemblyDefinition assembly in assemblies) | ||
|  |         { | ||
|  |             if (!action(assembly)) | ||
|  |             { | ||
|  |                 return; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |