Beispiel #1
0
        public void SetDynamicMethodOptionsOfProperty(DynamicMethodOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException();
            }

            _DynamicOptionsProperty = options;
        }
Beispiel #2
0
        public void SetDynamicMethodOptionsOfField(DynamicMethodOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException();
            }

            _DynamicOptionsField = options;
        }
Beispiel #3
0
        /* https://msdn.microsoft.com/zh-cn/library/system.reflection.emit.dynamicmethod(v=vs.100).aspx
         *
         * 如果动态方法被匿名承载,则它位于系统提供的程序集中,因此独立于其他代码。
         * 默认情况下,动态方法不能访问任何非公共数据。
         * 如果已授予匿名承载的动态方法带有 ReflectionPermissionFlag.RestrictedMemberAccess 标志的 ReflectionPermission,则它可以受限制地跳过 JIT 编译器的可见性检查。
         * 非公共成员可由动态方法访问的程序集的信任级别必须与发出该动态方法的调用堆栈的信任级别(或其子集)相同。
         *
         *
         * 如果动态方法与您指定的类型关联,则该动态方法可以访问该类型的所有成员,无论是何访问级别。
         * 此外,还可以跳过 JIT 可见性检查。 这使得动态方法可以访问在相同模块或任何程序集的任何其他模块中声明的其他类型的私有数据。
         * 您可以将动态方法与任何类型关联,但是您的代码必须被授予带有 ReflectionPermissionFlag.RestrictedMemberAccess 和 ReflectionPermissionFlag.MemberAccess 标志的 ReflectionPermission。
         *
         *
         * 如果该动态方法与您指定的模块关联,则该动态方法对于该模块在全局范围内有效。
         * 它可以访问模块中的所有类型和这些类型的所有 internal 成员。
         * 您可以将动态方法与任意模块关联,无论该模块是否由您创建,只要可以通过包含您的代码的调用堆栈满足带有 ReflectionPermissionFlag.RestrictedMemberAccess 标志的 ReflectionPermission 的要求。
         * 如果 ReflectionPermissionFlag.MemberAccess 标志包含在授予中,则该动态方法可以跳过 JIT 编译器的可见性检查,并可以访问在该模块中或任何程序集的任何其他模块中声明的所有类型的私有数据。
         */
        /// <summary>
        ///
        /// </summary>
        /// <param name="return">返回类型</param>
        /// <param name="parameters">方法参数类型集合</param>
        /// <param name="options">配置</param>
        /// <param name="member">反射成员</param>
        /// <returns></returns>
        static DynamicMethod CreateDynamicMethod(Type @return, Type[] parameters, DynamicMethodOptions options, MemberInfo member)
        {
            switch (options.Hosted)
            {
            case DynamicMethodHosted.Anonymous:
                return(new DynamicMethod(string.Empty, @return, parameters, options.SkipVisibility));

            case DynamicMethodHosted.TypeSpecify:
                return(new DynamicMethod(string.Empty, @return, parameters, options.Type, options.SkipVisibility));

            case DynamicMethodHosted.TypeReflected:
                return(new DynamicMethod(string.Empty, @return, parameters, member.ReflectedType, options.SkipVisibility));

            case DynamicMethodHosted.ModuleSpecify:
                return(new DynamicMethod(string.Empty, @return, parameters, options.Module, options.SkipVisibility));

            case DynamicMethodHosted.ModuleReflected:
                return(new DynamicMethod(string.Empty, @return, parameters, member.Module, options.SkipVisibility));
            }
            throw new NotSupportedException();
        }