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); }