Skip to content

Commit

Permalink
fix: Null reference when there is no parameter on method
Browse files Browse the repository at this point in the history
  • Loading branch information
labbbirder committed Nov 29, 2023
1 parent f50d256 commit e0ab1f0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
22 changes: 15 additions & 7 deletions Editor/InjectHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using UnityEditorInternal;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine.Assertions;

namespace com.bbbirder.injection.editor
{
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -129,8 +130,9 @@ static IEnumerable<Type> 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;
Expand Down Expand Up @@ -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)
Expand All @@ -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)));
Expand Down Expand Up @@ -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<string> knownAssemblyNames = new();
List<ModuleDefinition> modules = new();
GetModules(md);
foreach (var m in modules)
{
Assert.IsNotNull(m);
var tp = m.GetType(type.Namespace, type.Name);
if (null != tp)
{
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down

0 comments on commit e0ab1f0

Please sign in to comment.