From c482eb52d3f07671c3b65c164609d5fff76fb9d3 Mon Sep 17 00:00:00 2001 From: kmyuhkyuk <2451614940@qq.com> Date: Tue, 11 Oct 2022 06:20:38 +0800 Subject: [PATCH] Update --- SkinHide/Utils/RefHelp.cs | 53 ++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/SkinHide/Utils/RefHelp.cs b/SkinHide/Utils/RefHelp.cs index 26f011a..a6fdc2a 100644 --- a/SkinHide/Utils/RefHelp.cs +++ b/SkinHide/Utils/RefHelp.cs @@ -20,20 +20,42 @@ namespace SkinHide.Utils var declaringType = method.DeclaringType; - var DelegateParameters = delegateType.GetMethod("Invoke").GetParameters(); + var DelegateMethod = delegateType.GetMethod("Invoke"); + var DelegateParameters = DelegateMethod.GetParameters(); var DelegateparameterTypes = DelegateParameters.Select(x => x.ParameterType).ToArray(); - var dmd = new DynamicMethod("OpenInstanceDelegate_" + method.Name, method.ReturnType, DelegateparameterTypes); + Type ReturnType; + bool NeedBox; + + if (DelegateMethod.ReturnType == typeof(object) && method.ReturnType.IsValueType) + { + ReturnType = typeof(object); + + NeedBox = true; + } + else + { + ReturnType = method.ReturnType; + + NeedBox = false; + } + + var dmd = new DynamicMethod("OpenInstanceDelegate_" + method.Name, ReturnType, DelegateparameterTypes); var ilGen = dmd.GetILGenerator(); + Type[] parameterTypes; + + int num; + if (!method.IsStatic) { var parameters = method.GetParameters(); var numParameters = parameters.Length; - var parameterTypes = new Type[numParameters + 1]; + parameterTypes = new Type[numParameters + 1]; parameterTypes[0] = typeof(object); - for (var i = 0; i < numParameters; i++) + + for (int i = 0; i < numParameters; i++) { parameterTypes[i + 1] = parameters[i].ParameterType; } @@ -49,19 +71,21 @@ namespace SkinHide.Utils ilGen.Emit(OpCodes.Castclass, declaringType); - for (var i = 1; i < parameterTypes.Length; i++) - { - ilGen.Emit(OpCodes.Ldarg, i); - ilGen.Emit(OpCodes.Castclass, parameterTypes[i]); - } + num = 1; } else { - var parameterTypes = method.GetParameters().Select(x => x.ParameterType).ToArray(); + parameterTypes = method.GetParameters().Select(x => x.ParameterType).ToArray(); - for (var i = 0; i < parameterTypes.Length; i++) + num = 0; + } + + for (int i = num; i < parameterTypes.Length; i++) + { + ilGen.Emit(OpCodes.Ldarg, i); + + if (!parameterTypes[i].IsValueType) { - ilGen.Emit(OpCodes.Ldarg, i); ilGen.Emit(OpCodes.Castclass, parameterTypes[i]); } } @@ -76,6 +100,11 @@ namespace SkinHide.Utils ilGen.Emit(OpCodes.Callvirt, method); } + if (NeedBox) + { + ilGen.Emit(OpCodes.Box, method.ReturnType); + } + ilGen.Emit(OpCodes.Ret); return (DelegateType)dmd.CreateDelegate(delegateType);