static UnmanagedMemory() { const string dynamicModuleName = nameof(UnmanagedMemory) + "DynamicMethods"; var module = AssemblyBuilder.DefineDynamicAssembly( new AssemblyName(dynamicModuleName), AssemblyBuilderAccess.RunAndCollect ) .DefineDynamicModule(dynamicModuleName); var dynClass = module.DefineType( "DynamicMethods", TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed ); var initBlock = dynClass.DefineMethod( nameof(ZeroMemory), MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.Final, CallingConventions.Standard, typeof(void), new [] { typeof(IntPtr), typeof(uint) }); initBlock.SetImplementationFlags(MethodImplAttributes.AggressiveInlining); { var il = initBlock.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldc_I4_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Initblk); il.Emit(OpCodes.Ret); } var createdClass = dynClass.CreateTypeInfo(); ZeroMemory = (ZeroMemoryDelegate)Delegate.CreateDelegate(typeof(ZeroMemoryDelegate), createdClass.GetDeclaredMethod(nameof(ZeroMemory))); }
static Native() { var staticMethods = typeof(Buffer) .GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).ToArray(); var bufferMemCpyMethods = staticMethods .Where(mi => mi.Name == "Memcpy").ToArray(); MemcpyFromUnmanaged = (MemcpyFromUnmanagedDelegate) Delegate.CreateDelegate(typeof(MemcpyFromUnmanagedDelegate), bufferMemCpyMethods.Single(mi => { var parameters = mi.GetParameters(); return(parameters.Length == 5 && parameters[0].ParameterType == typeof(byte[])); })); MemcpyToUnmanaged = (MemcpyToUnmanagedDelegate) Delegate.CreateDelegate(typeof(MemcpyToUnmanagedDelegate), bufferMemCpyMethods.Single(mi => { var parameters = mi.GetParameters(); return(parameters.Length == 5 && parameters[0].ParameterType == typeof(byte *)); })); MemcpyUnmanaged = (MemcpyUnmanagedDelegate) Delegate.CreateDelegate(typeof(MemcpyUnmanagedDelegate), bufferMemCpyMethods.Single(mi => mi.GetParameters().Length == 3)); ZeroMemory = (ZeroMemoryDelegate) Delegate.CreateDelegate(typeof(ZeroMemoryDelegate), staticMethods.Single(mi => mi.Name == "ZeroMemory")); GetSystemInfo(out Info); }
static Native() { var staticMethods = typeof (Buffer) .GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).ToArray(); var bufferMemCpyMethods = staticMethods .Where(mi => mi.Name == "Memcpy").ToArray(); MemcpyFromUnmanaged = (MemcpyFromUnmanagedDelegate) Delegate.CreateDelegate(typeof (MemcpyFromUnmanagedDelegate), bufferMemCpyMethods.Single(mi => { var parameters = mi.GetParameters(); return parameters.Length == 5 && parameters[0].ParameterType == typeof (byte[]); })); MemcpyToUnmanaged = (MemcpyToUnmanagedDelegate) Delegate.CreateDelegate(typeof (MemcpyToUnmanagedDelegate), bufferMemCpyMethods.Single(mi => { var parameters = mi.GetParameters(); return parameters.Length == 5 && parameters[0].ParameterType == typeof (byte*); })); MemcpyUnmanaged = (MemcpyUnmanagedDelegate) Delegate.CreateDelegate(typeof (MemcpyUnmanagedDelegate), bufferMemCpyMethods.Single(mi => mi.GetParameters().Length == 3)); ZeroMemory = (ZeroMemoryDelegate) Delegate.CreateDelegate(typeof (ZeroMemoryDelegate), staticMethods.Single(mi => mi.Name == "ZeroMemory")); GetSystemInfo(out Info); }