Skip to content

Commit ffa1721

Browse files
committed
fixes #4
1 parent ab79ef5 commit ffa1721

File tree

3 files changed

+135
-8
lines changed

3 files changed

+135
-8
lines changed

Editor/InjectHelper.cs

+71-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
using System.IO;
66
using System.Linq;
77
using UnityEngine;
8-
using UnityEngine.TestTools;
98
using UnityEditorInternal;
109
using UnityEditor;
1110
using UnityEditor.Compilation;
1211
using UnityEngine.Assertions;
12+
using System.Text;
1313

1414
namespace com.bbbirder.injection.editor
1515
{
@@ -371,10 +371,77 @@ internal static Type GetUnderlyingType(this TypeReference td)
371371
=> td.IsPrimitive ? Type.GetType(td.Name) : objType;
372372

373373
internal static string GetSignature(this MethodDefinition md)
374-
=> $"{md.Name}({string.Join(",", md.Parameters.Select(p => p.ParameterType.FullName))})";
374+
{
375+
var builder = new StringBuilder();
376+
builder.Append(md.Name);
377+
if (md.HasGenericParameters)
378+
{
379+
builder.Append('`');
380+
builder.Append(md.GenericParameters.Count);
381+
}
382+
builder.Append('(');
383+
384+
if (md.HasParameters)
385+
{
386+
var parameters = md.Parameters;
387+
for (int i = 0; i < parameters.Count; i++)
388+
{
389+
ParameterDefinition parameterDefinition = parameters[i];
390+
if (i > 0)
391+
{
392+
builder.Append(",");
393+
}
394+
395+
AppendTypeFullName(builder, parameterDefinition.ParameterType);
396+
}
397+
}
398+
399+
builder.Append(')');
400+
return builder.ToString();
401+
402+
static void AppendTypeFullName(StringBuilder builder, TypeReference type)
403+
{
404+
if (!string.IsNullOrEmpty(type.Namespace))
405+
{
406+
builder.Append(type.Namespace);
407+
builder.Append("::");
408+
}
409+
410+
var stack = new Stack<TypeReference>();
411+
var declaringType = type;
412+
while (null != declaringType)
413+
{
414+
stack.Push(declaringType);
415+
declaringType = declaringType.DeclaringType;
416+
}
417+
while (stack.TryPop(out var nestedType)) AppendNestedType(builder, nestedType);
418+
}
419+
static void AppendNestedType(StringBuilder builder, TypeReference type)
420+
{
421+
builder.Append(type.Name);
422+
if (type is GenericInstanceType gInst)
423+
{
424+
builder.Append('<');
425+
var args = gInst.GenericArguments;
426+
for (int i = 0; i < args.Count; i++)
427+
{
428+
if (i != 0)
429+
{
430+
builder.Append(',');
431+
}
432+
AppendTypeFullName(builder, args[i]);
433+
}
434+
builder.Append('>');
435+
}
436+
}
437+
}
375438

376439
internal static MethodReference FindMethod(this TypeDefinition td, string methodSignature)
377-
=> td.Module.ImportReference(td.Methods.FirstOrDefault(m => m.GetSignature().Equals(methodSignature)));
440+
{
441+
var method = td.Methods.FirstOrDefault(m => m.GetSignature().Equals(methodSignature));
442+
if (method is null) return null;
443+
return td.Module.ImportReference(method);
444+
}
378445

379446
internal static MethodReference FindMethodByName(this TypeDefinition td, string methodName)
380447
=> td.Module.ImportReference(td.Methods.FirstOrDefault(m => m.Name.Equals(methodName)));
@@ -492,7 +559,7 @@ internal static TypeDefinition CreateDelegateType(this ModuleDefinition assembly
492559
return dt;
493560
}
494561

495-
562+
496563
static Type voidType = typeof(void);
497564
static Type objType = typeof(object);
498565
static OpCode[] s_ldargs = new[] { OpCodes.Ldarg_0, OpCodes.Ldarg_1, OpCodes.Ldarg_2, OpCodes.Ldarg_3 };

Runtime/FixHelper.cs

+63-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using System.Linq;
55
using System.IO;
66
using UnityEngine;
7-
using com.bbbirder.injection;
7+
using System.Text;
88

99
namespace com.bbbirder.injection
1010
{
@@ -221,8 +221,68 @@ public static string GetAssemblyPath(this Assembly assembly)
221221
return null;
222222
}
223223

224-
public static string GetSignature(this MethodBase m)
225-
=> $"{m.Name}({string.Join(",", m.GetParameters().Select(p => p.ParameterType.FullName))})";
224+
public static string GetSignature(this MethodBase method)
225+
{
226+
var builder = new StringBuilder();
227+
builder.Append(method.Name);
228+
if (method.IsGenericMethod)
229+
{
230+
builder.Append('`');
231+
builder.Append(method.GetGenericArguments().Length);
232+
}
233+
builder.Append('(');
234+
235+
var parameters = method.GetParameters();
236+
for (int i = 0; i < parameters.Length; i++)
237+
{
238+
var parameterDefinition = parameters[i];
239+
if (i > 0)
240+
{
241+
builder.Append(",");
242+
}
243+
244+
AppendTypeFullName(builder, parameterDefinition.ParameterType);
245+
}
246+
247+
builder.Append(')');
248+
return builder.ToString();
249+
250+
static void AppendTypeFullName(StringBuilder builder, Type type)
251+
{
252+
if (!string.IsNullOrEmpty(type.Namespace))
253+
{
254+
builder.Append(type.Namespace);
255+
builder.Append("::");
256+
}
257+
258+
var stack = new Stack<Type>();
259+
var declaringType = type;
260+
while (null != declaringType)
261+
{
262+
stack.Push(declaringType);
263+
declaringType = declaringType.DeclaringType;
264+
}
265+
while (stack.TryPop(out var name)) AppendNestedType(builder, name);
266+
}
267+
static void AppendNestedType(StringBuilder builder, Type type)
268+
{
269+
builder.Append(type.Name);
270+
if (type.IsGenericType)
271+
{
272+
builder.Append('<');
273+
var args = type.GenericTypeArguments;
274+
for (int i = 0; i < args.Length; i++)
275+
{
276+
if (i != 0)
277+
{
278+
builder.Append(',');
279+
}
280+
AppendTypeFullName(builder, args[i]);
281+
}
282+
builder.Append('>');
283+
}
284+
}
285+
}
226286

227287
static InjectionInfo[] m_allInjections;
228288
public static InjectionInfo[] allInjections => m_allInjections ??= GetAllInjections();

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "com.bbbirder.injection",
33
"displayName": "Unity Injection",
44
"description": "Unity注入模块,可以运行时改变被注入函数实现。",
5-
"version": "1.3.29",
5+
"version": "1.3.31",
66
"hideInEditor": false,
77
"author": "bbbirder <502100554@qq.com>",
88
"dependencies": {

0 commit comments

Comments
 (0)