/// <summary> /// Creates a new field in the target assembly, for the specified type. /// </summary> /// <param name="targetDeclaringType">The target declaring type.</param> /// <param name="yourField">Your field.</param> /// <param name="attr">The action attribute.</param> /// <exception cref="PatchDeclerationException">Thrown if this member collides with another member, and the error cannot be resolved.</exception> /// <returns></returns> private NewMemberStatus CreateNewField(TypeDefinition targetDeclaringType, FieldDefinition yourField, NewMemberAttribute attr) { if (attr.IsImplicit) { Log_implicitly_creating_member("field", yourField); } else { Log_creating_member("field", yourField); } var maybeDuplicate = targetDeclaringType.GetField(yourField.Name); if (maybeDuplicate != null) { Log_duplicate_member("field", yourField, maybeDuplicate); if ((DebugOptions & DebugFlags.CreationOverwrites) != 0) { Log_overwriting(); return NewMemberStatus.Continue; } if (attr.IsImplicit) { return NewMemberStatus.InvalidItem; } throw Errors.Duplicate_member("type", yourField.FullName, maybeDuplicate.FullName); } var targetField = new FieldDefinition(yourField.Name, yourField.Resolve().Attributes, FixTypeReference(yourField.FieldType)) { InitialValue = yourField.InitialValue, //probably for string consts Constant = yourField.Constant }; targetDeclaringType.Fields.Add(targetField); return NewMemberStatus.Continue; }
private void AutoModifyField(TypeDefinition targetType, MemberActionAttribute fieldActionAttr, FieldDefinition yourField) { Log_modifying_member("field", yourField); (fieldActionAttr != null).AssertTrue(); var asModifies = fieldActionAttr as ModifiesMemberAttribute; string targetFieldName = null; ModificationScope scope; if (asModifies != null) { targetFieldName = asModifies.MemberName ?? yourField.Name; scope = asModifies.Scope; } else if (fieldActionAttr is NewMemberAttribute) { targetFieldName = yourField.Name; scope = ModificationScope.All; } else { throw Errors.Unknown_action_attribute(fieldActionAttr); } var targetField = targetType.GetField(targetFieldName); if (targetField == null) { throw Errors.Missing_member("field", yourField, targetFieldName); } if ((scope & ModificationScope.Accessibility) != 0) { targetField.SetAccessibility(yourField.GetAccessbility()); } if ((scope & ModificationScope.CustomAttributes) != 0) { CopyCustomAttributes(targetField, yourField); } if ((scope & ModificationScope.Body) != 0) { targetField.InitialValue = yourField.InitialValue; //dunno what this is used for targetField.Constant = yourField.Constant; } }
public static void InjectInto(AssemblyDefinition asm) { _asm = asm; _main = asm.MainModule.GetType("Terraria.Main"); _spriteBatch = _main.GetField("spriteBatch"); _hooksClass = _asm.MainModule.GetType("Terraria.PrismInjections.Hooks"); _typeSystem = _asm.MainModule.TypeSystem; InjectItemHook(); InjectProjectileHook(); InjectNPCHook(); InjectDrawInterfaceCalls(); InjectInputUpdate(); }
/// <summary> /// Creates a new field in the target assembly, for the specified type. /// </summary> /// <param name="targetDeclaringType">The target declaring type.</param> /// <param name="yourField">Your field.</param> /// <param name="attr">The action attribute.</param> /// <exception cref="PatchDeclerationException">Thrown if this member collides with another member, and the error cannot be resolved.</exception> /// <returns></returns> private FieldDefinition CreateNewField(TypeDefinition targetDeclaringType, FieldDefinition yourField, NewMemberAttribute attr) { if (attr.IsImplicit) { Log_implicitly_creating_member("field", yourField); } else { Log_creating_member("field", yourField); } var newName = attr.NewMemberName ?? yourField.Name; var maybeDuplicate = targetDeclaringType.GetField(newName); if (maybeDuplicate != null) { var prevName = newName; Log_duplicate_member("field", yourField, maybeDuplicate); newName = GetNameAfterCollision(newName); Log_name_changed("field", yourField, prevName, newName); } var targetField = CopyField(yourField, newName); targetDeclaringType.Fields.Add(targetField); return targetField; }
static void AssertField (TypeDefinition type, string name, Type expected) { var field = type.GetField (name); Assert.IsNotNull (field, name); Assert.AreEqual (expected.FullName, field.FieldType.FullName); }