Update
This commit is contained in:
parent
e90a67a8d5
commit
c482eb52d3
@ -20,20 +20,42 @@ namespace SkinHide.Utils
|
|||||||
|
|
||||||
var declaringType = method.DeclaringType;
|
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 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();
|
var ilGen = dmd.GetILGenerator();
|
||||||
|
|
||||||
|
Type[] parameterTypes;
|
||||||
|
|
||||||
|
int num;
|
||||||
|
|
||||||
if (!method.IsStatic)
|
if (!method.IsStatic)
|
||||||
{
|
{
|
||||||
var parameters = method.GetParameters();
|
var parameters = method.GetParameters();
|
||||||
var numParameters = parameters.Length;
|
var numParameters = parameters.Length;
|
||||||
var parameterTypes = new Type[numParameters + 1];
|
parameterTypes = new Type[numParameters + 1];
|
||||||
parameterTypes[0] = typeof(object);
|
parameterTypes[0] = typeof(object);
|
||||||
for (var i = 0; i < numParameters; i++)
|
|
||||||
|
for (int i = 0; i < numParameters; i++)
|
||||||
{
|
{
|
||||||
parameterTypes[i + 1] = parameters[i].ParameterType;
|
parameterTypes[i + 1] = parameters[i].ParameterType;
|
||||||
}
|
}
|
||||||
@ -49,19 +71,21 @@ namespace SkinHide.Utils
|
|||||||
|
|
||||||
ilGen.Emit(OpCodes.Castclass, declaringType);
|
ilGen.Emit(OpCodes.Castclass, declaringType);
|
||||||
|
|
||||||
for (var i = 1; i < parameterTypes.Length; i++)
|
num = 1;
|
||||||
{
|
|
||||||
ilGen.Emit(OpCodes.Ldarg, i);
|
|
||||||
ilGen.Emit(OpCodes.Castclass, parameterTypes[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
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]);
|
ilGen.Emit(OpCodes.Castclass, parameterTypes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,6 +100,11 @@ namespace SkinHide.Utils
|
|||||||
ilGen.Emit(OpCodes.Callvirt, method);
|
ilGen.Emit(OpCodes.Callvirt, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NeedBox)
|
||||||
|
{
|
||||||
|
ilGen.Emit(OpCodes.Box, method.ReturnType);
|
||||||
|
}
|
||||||
|
|
||||||
ilGen.Emit(OpCodes.Ret);
|
ilGen.Emit(OpCodes.Ret);
|
||||||
|
|
||||||
return (DelegateType)dmd.CreateDelegate(delegateType);
|
return (DelegateType)dmd.CreateDelegate(delegateType);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user