대상 함수 지정 - solaris0115/RimWorldModGuide GitHub Wiki

PatchAll(Assembly assembly)를 호출 할때, 하모니는 모든 클래스와 함수를 탐색한 뒤 패치 속성을 갖은 함수들을 적용합니다.

예시

[HarmonyPatch(typeof(대상이 될 타입))]
[HarmonyPatch("대상함수 이름")]
class MyPatchClass
{
	static void Postfix(...)
	{
		...
	}
}

패치 속성에는 대상이 될 함수에 대한 정보가 충분히 있어야 합니다. 대체적으로 패치할 함수 하나당 클래스 하나가 존재합니다. 그리고 그 클래스에 Prefix, Postfix, Transpiler를 조합해 패치를 만들 수 있습니다. 그리고 하모니가 실행되면 자동적으로 찾아내 적용할 것입니다. 만약 위와 같은 이름의 패치함수가 아니더라도 특정 속성을 통해 동일하게 적용이 가능합니다.

패치 속성 형태

다음을 통해 패치 클래스임을 알릴 수 있습니다.

  • [HarmonyPatch(Type, Type[])] 패치할 함수가 있는 타입을 지정한다. (Type[]은 제네릭 형식일때만 포함.)
  • [HarmonyPatch(String)] 패치할 함수의 이름을 지정한다.
  • [HarmonyPatch(String, PropertyMethod)] 패치할 프로퍼티의 이름과 프로퍼티(Getter or Setter)를 지정한다
  • [HarmonyPatch(Type[])] 패치할 함수에서 사용되는 매개변수 타입들을 정해준다. (오버로드된 함수가 존재할때 구분하기 위해서) 아래는 한번에 알리는 방법이다.
  • [HarmonyPatch(Type, String, Type[])] 패치할 함수가 있는 타입, 패치할 함수명, 매게 변수 타입들

패치 속성 조합

아래와 같은 방법으로 패치 속성을 조합하여 사용할 수 있습니다.

**String.ToUpper()**함수를 패치한다면

[HarmonyPatch(typeof(String))]
[HarmonyPatch("ToUpper")]

MyClass에서 Account프로퍼티의 Setter를 패치한다면

[HarmonyPatch(typeof(MyClass))]
[HarmonyPatch("Account", PropertyMethod.Setter)]

**String.IndexOf(char,int)**를 패치한다면

[HarmonyPatch(typeof(String))]
[HarmonyPatch("IndexOf")]
[HarmonyPatch(new Type[] { typeof(char), typeof(int) })]

//or

[HarmonyPatch(typeof(String), "IndexOf", new Type[] { typeof(char), typeof(int) })]

패치 클래스는 어떤 한정자를 갖아도 상관 없습니다. 하지만 패치 함수는 반드시 static을 포함하여야 합니다. 왜냐하면 패치 클래스는 별도의 인스턴스를 갖지 않기 때문입니다.
만약 수동패치를 사용할 경우 패치 함수는 다이나믹함수가 될 수 있습니다.

제네릭 함수

제네릭이 사용된 함수는 일반적으로 패치를 할 수 없습니다. 하지만 다음과 같은 방법을 통해 하나씩 패치할 수 있습니다.

public void AddItem( T item )//기존 제네릭 함수
[HarmonyPatch(typeof(String))]
[HarmonyPatch("IndexOf")]
[HarmonyPatch(new Type[] { typeof(int)})]
클래스.Prefix( ref int item )

[HarmonyPatch(typeof(String))]
[HarmonyPatch("IndexOf")]
[HarmonyPatch(new Type[] { typeof(string)})]
클래스.Prefix( string item )

다음: 실행 흐름