pardeike / Harmony

A library for patching, replacing and decorating .NET and Mono methods during runtime
https://www.patreon.com/pardeike
MIT License
5.16k stars 486 forks source link

Support GenericInstance types in inline method signatures #565

Closed Zetrith closed 7 months ago

Zetrith commented 8 months ago

Currently, Harmony can't patch nor MethodCopier.GetInstructions of methods with calli instructions containing generic instances in their signature such as in this example:

calli void(class [mscorlib]System.Collections.Generic.List`1<int>)

Patching or calling GetInstructions on such methods results in:

System.NotSupportedException: Unsupported generic callsite element: GenericInstance

This is a rare but legitimate case that's come up in something I'm working on. Note that this isn't about open generics (like List<T>, which Harmony doesn't really support) but closed ones (e.g. List<int>).

The pull request fixes this issue by adding support for type signature elements of kind GenericInstance in the inline signature parser. The patch is directly based on Mono.Cecil's implementation: https://github.com/jbevain/cecil/blob/96026325ee1cb6627a3e4a32b924ab2905f02553/Mono.Cecil/AssemblyReader.cs#L3424

This change purely expands the set of patchable methods so poses no backwards compatibility concerns.