From e0ab1f06a90c67edfc59746d49d2ec152b29f2f5 Mon Sep 17 00:00:00 2001 From: labbbirder <502100554@qq.com> Date: Wed, 29 Nov 2023 14:35:41 +0800 Subject: [PATCH] fix: Null reference when there is no parameter on method --- Editor/InjectHelper.cs | 22 +++++++++++++++------- package.json | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Editor/InjectHelper.cs b/Editor/InjectHelper.cs index e90bca5..0b178b0 100644 --- a/Editor/InjectHelper.cs +++ b/Editor/InjectHelper.cs @@ -9,6 +9,7 @@ using UnityEditorInternal; using UnityEditor; using UnityEditor.Compilation; +using UnityEngine.Assertions; namespace com.bbbirder.injection.editor { @@ -60,10 +61,10 @@ internal static bool InjectAssembly(InjectionInfo[] injections, string inputAsse return false; } - foreach (var group in injections.GroupBy(inj=>inj.InjectedMethod)) + foreach (var group in injections.GroupBy(inj => inj.InjectedMethod)) { var injectedMethod = group.Key; - if(injectedMethod is null) continue; + if (injectedMethod is null) continue; var type = injectedMethod.DeclaringType; var methodName = injectedMethod.Name; var targetType = GetCorrespondingType(targetAssembly.MainModule, type); @@ -129,8 +130,9 @@ static IEnumerable GetContainingTypes(Type type) static MethodDefinition DuplicateOriginalMethod(this TypeDefinition targetType, MethodDefinition targetMethod) { var originName = Constants.GetOriginMethodName(targetMethod.Name); - var duplicatedMethod = targetType.Methods.FirstOrDefault(m=>m.Name==originName); - if(duplicatedMethod is null){ + var duplicatedMethod = targetType.Methods.FirstOrDefault(m => m.Name == originName); + if (duplicatedMethod is null) + { duplicatedMethod = targetMethod.Clone(); duplicatedMethod.IsPrivate = true; duplicatedMethod.Name = originName; @@ -161,11 +163,15 @@ static void Release(this AssemblyDefinition assemblyDefinition) // var delegateType = targetType.Module.CreateDelegateType(Settings.GetDelegateTypeName(methodName),targetType,ReturnType,delegateParameters); // targetType.NestedTypes.Add(delegateType); - var genName = targetMethod.IsReturnVoid() ? "System.Action`" : "System.Func`"; + var genName = targetMethod.IsReturnVoid() ? "System.Action" : "System.Func"; var genPCnt = Parameters.Count; if (!ReturnVoid) genPCnt++; if (HasThis) genPCnt++; - var rawGenType = targetType.Module.FindType(Type.GetType(genName + genPCnt)); + if (genPCnt > 0) + { + genName += "`" + genPCnt; + } + var rawGenType = targetType.Module.FindType(Type.GetType(genName)); var genType = targetType.Module.ImportReference(rawGenType); var genInst = new GenericInstanceType(genType); if (HasThis) @@ -183,7 +189,7 @@ static void Release(this AssemblyDefinition assemblyDefinition) genInst); targetType.Fields.Add(sfldInject); } - + // var sfldOrigin = new FieldDefinition(originName, // FieldAttributes.Private|FieldAttributes.Static|FieldAttributes.Assembly, // targetType.Module.ImportReference(typeof(Delegate))); @@ -364,11 +370,13 @@ internal static MethodReference FindMethod(this TypeDefinition td, string method => td.Module.ImportReference(td.Methods.FirstOrDefault(m => m.Name == methodName)); internal static TypeDefinition FindType(this ModuleDefinition md, Type type) { + Assert.IsNotNull(type); HashSet knownAssemblyNames = new(); List modules = new(); GetModules(md); foreach (var m in modules) { + Assert.IsNotNull(m); var tp = m.GetType(type.Namespace, type.Name); if (null != tp) { diff --git a/package.json b/package.json index aa79b53..6d8decf 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "com.bbbirder.injection", "displayName": "Unity Injection", "description": "Unity注入模块,可以运行时改变被注入函数实现。", - "version": "1.3.18", + "version": "1.3.19", "hideInEditor": false, "author": "bbbirder <502100554@qq.com>", "dependencies": {