private AssemblyWeaver(AssemblyDefinition targetAssemblyDef) { TargetModule = targetAssemblyDef.MainModule; Copier = new CecilCopier(targetAssemblyDef.MainModule); AddSearchDirectory(Directory.GetCurrentDirectory()); }
public TypeWeaver(TypeDefinition originTypeDef, TypeDefinition destinationTypeDef, CecilCopier copier) { this.DestinationType = destinationTypeDef; this.OriginType = originTypeDef; this.copier = copier; constants = new Dictionary<FieldReference, object>(); }
public static void CollectReferences(string assemblyLocation, HashSet<Type> types) { var origAssemblyDef = CecilUtils.GetAssemblyDef(assemblyLocation); var assemblyDef = CecilUtils.CreateEmptyAssemblyDef(); var copier = new CecilCopier(assemblyDef.MainModule); var count = types.Count; if (count == 0) return; var assembly = types.First().Assembly; foreach (var type in types) { if(type.Assembly != assembly) throw new Exception("Expected types of same assembly."); var typeDef = CecilUtils.GetTypeDef(origAssemblyDef.MainModule, new TypeSignature(type)); copier.Copy(typeDef, false); } copier.Process(); var scopeName = origAssemblyDef.Name.Name + ".dll"; foreach (var error in copier.Errors) { var import = error as UnexpectedImport; if (import == null) continue; if (import.Scope.Name != scopeName) continue; var type = import.Member as TypeReference ?? import.Member.DeclaringType; var typeName = type.FullName; types.Add(assembly.GetType(typeName)); } if (count < types.Count) CollectReferences(assemblyLocation, types); }
private CecilCopier GetCreateCopier(ModuleDefinition origModuleDef) { CecilCopier copier; if (copiers.TryGetValue(origModuleDef, out copier)) return copier; copier = new CecilCopier(origModuleDef, DestinationAssembly.MainModule); copiers.Add(origModuleDef, copier); return copier; }