mirror of https://github.com/ogoun/Zero.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
26 lines
945 B
26 lines
945 B
using System;
|
|
using System.Reflection.Emit;
|
|
|
|
namespace ZeroLevel.Services.Reflection
|
|
{
|
|
public static class ReferenceHelpers
|
|
{
|
|
public static readonly Action<object, Action<IntPtr>> GetPinnedPtr;
|
|
|
|
static ReferenceHelpers()
|
|
{
|
|
var dyn = new DynamicMethod("GetPinnedPtr", typeof(void), new[] { typeof(object), typeof(Action<IntPtr>) }, typeof(ReferenceHelpers).Module);
|
|
var il = dyn.GetILGenerator();
|
|
il.DeclareLocal(typeof(object), true);
|
|
il.Emit(OpCodes.Ldarg_0);
|
|
il.Emit(OpCodes.Stloc_0);
|
|
il.Emit(OpCodes.Ldarg_1);
|
|
il.Emit(OpCodes.Ldloc_0);
|
|
il.Emit(OpCodes.Conv_I);
|
|
il.Emit(OpCodes.Call, typeof(Action<IntPtr>).GetMethod("Invoke"));
|
|
il.Emit(OpCodes.Ret);
|
|
GetPinnedPtr = (Action<object, Action<IntPtr>>)dyn.CreateDelegate(typeof(Action<object, Action<IntPtr>>));
|
|
}
|
|
}
|
|
}
|