Exemple #1
0
        private static ModuleBuilder GetProxyModuleBuilder()
        {
            Assumes.True(Monitor.IsEntered(MetadataViewFactories));
            if (transparentProxyModuleBuilder == null)
            {
                // make a new assemblybuilder and modulebuilder
                var assemblyBuilder = CreateProxyAssemblyBuilder(typeof(SecurityTransparentAttribute).GetTypeInfo().GetConstructor(Type.EmptyTypes));
                transparentProxyModuleBuilder = assemblyBuilder.DefineDynamicModule("MetadataViewProxiesModule");
                skipClrVisibilityChecks       = new SkipClrVisibilityChecks(assemblyBuilder, transparentProxyModuleBuilder);
            }

            return(transparentProxyModuleBuilder);
        }
        /// <summary>
        /// Gets the <see cref="ModuleBuilder"/> to use for generating a proxy for the given type.
        /// </summary>
        /// <param name="viewType">The type of the interface to generate a proxy for.</param>
        /// <returns>The <see cref="ModuleBuilder"/> to use.</returns>
        private static ModuleBuilder GetProxyModuleBuilder(TypeInfo viewType)
        {
            Requires.NotNull(viewType, nameof(viewType));
            Assumes.True(Monitor.IsEntered(MetadataViewFactories));

            // Dynamic assemblies are relatively expensive. We want to create as few as possible.
            // For each unique set of skip visibility check assemblies, we need a new dynamic assembly
            // because the CLR will not honor any additions to that set once the first generated type is closed.
            // So maintain a dictionary to point at dynamic modules based on the set of skip visiblity check assemblies they were generated with.
            var skipVisibilityCheckAssemblies = SkipClrVisibilityChecks.GetSkipVisibilityChecksRequirements(viewType);

            if (!TransparentProxyModuleBuilderByVisibilityCheck.TryGetValue(skipVisibilityCheckAssemblies, out ModuleBuilder moduleBuilder))
            {
                var assemblyBuilder = CreateProxyAssemblyBuilder(typeof(SecurityTransparentAttribute).GetTypeInfo().GetConstructor(Type.EmptyTypes));
                moduleBuilder = assemblyBuilder.DefineDynamicModule("MetadataViewProxiesModule");
                var skipClrVisibilityChecks = new SkipClrVisibilityChecks(assemblyBuilder, moduleBuilder);
                skipClrVisibilityChecks.SkipVisibilityChecksFor(skipVisibilityCheckAssemblies);
                TransparentProxyModuleBuilderByVisibilityCheck.Add(skipVisibilityCheckAssemblies, moduleBuilder);
            }

            return(moduleBuilder);
        }