Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }