private static RuntimeModule GetDynamicMethodsModule()
 {
     if (s_anonymouslyHostedDynamicMethodsModule == null)
     {
         lock (s_anonymouslyHostedDynamicMethodsModuleLock)
         {
             if (s_anonymouslyHostedDynamicMethodsModule != null)
             {
                 return(s_anonymouslyHostedDynamicMethodsModule);
             }
             CustomAttributeBuilder        builder = new CustomAttributeBuilder(typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes), new object[0]);
             List <CustomAttributeBuilder> unsafeAssemblyAttributes = new List <CustomAttributeBuilder> {
                 builder
             };
             CustomAttributeBuilder item = new CustomAttributeBuilder(typeof(SecurityRulesAttribute).GetConstructor(new Type[] { typeof(SecurityRuleSet) }), new object[] { SecurityRuleSet.Level1 });
             unsafeAssemblyAttributes.Add(item);
             AssemblyName    name      = new AssemblyName("Anonymously Hosted DynamicMethods Assembly");
             StackCrawlMark  lookForMe = StackCrawlMark.LookForMe;
             AssemblyBuilder builder3  = AssemblyBuilder.InternalDefineDynamicAssembly(name, AssemblyBuilderAccess.Run, null, null, null, null, null, ref lookForMe, unsafeAssemblyAttributes, SecurityContextSource.CurrentAssembly);
             AppDomain.PublishAnonymouslyHostedDynamicMethodsAssembly(builder3.GetNativeHandle());
             s_anonymouslyHostedDynamicMethodsModule = (InternalModuleBuilder)builder3.ManifestModule;
         }
     }
     return(s_anonymouslyHostedDynamicMethodsModule);
 }
Ejemplo n.º 2
0
        [System.Security.DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod
        private static RuntimeModule GetDynamicMethodsModule()
        {
            if (s_anonymouslyHostedDynamicMethodsModule != null)
                return s_anonymouslyHostedDynamicMethodsModule;

            lock (s_anonymouslyHostedDynamicMethodsModuleLock)
            {
                if (s_anonymouslyHostedDynamicMethodsModule != null)
                    return s_anonymouslyHostedDynamicMethodsModule;

                ConstructorInfo transparencyCtor = typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes);
                CustomAttributeBuilder transparencyAttribute = new CustomAttributeBuilder(transparencyCtor, Array.Empty<Object>());
                List<CustomAttributeBuilder> assemblyAttributes = new List<CustomAttributeBuilder>();
                assemblyAttributes.Add(transparencyAttribute);

                AssemblyName assemblyName = new AssemblyName("Anonymously Hosted DynamicMethods Assembly");
                StackCrawlMark stackMark = StackCrawlMark.LookForMe;

                AssemblyBuilder assembly = AssemblyBuilder.InternalDefineDynamicAssembly(
                    assemblyName,
                    AssemblyBuilderAccess.Run,
                    ref stackMark,
                    assemblyAttributes);

                AppDomain.PublishAnonymouslyHostedDynamicMethodsAssembly(assembly.GetNativeHandle());

                // this always gets the internal module.
                s_anonymouslyHostedDynamicMethodsModule = (InternalModuleBuilder)assembly.ManifestModule;
            }

            return s_anonymouslyHostedDynamicMethodsModule;
        }
Ejemplo n.º 3
0
        [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable
        private static RuntimeModule GetDynamicMethodsModule()
        {
            if (s_anonymouslyHostedDynamicMethodsModule != null)
            {
                return(s_anonymouslyHostedDynamicMethodsModule);
            }

            lock (s_anonymouslyHostedDynamicMethodsModuleLock)
            {
                if (s_anonymouslyHostedDynamicMethodsModule != null)
                {
                    return(s_anonymouslyHostedDynamicMethodsModule);
                }

                ConstructorInfo               transparencyCtor      = typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes);
                CustomAttributeBuilder        transparencyAttribute = new CustomAttributeBuilder(transparencyCtor, EmptyArray <Object> .Value);
                List <CustomAttributeBuilder> assemblyAttributes    = new List <CustomAttributeBuilder>();
                assemblyAttributes.Add(transparencyAttribute);
#if !FEATURE_CORECLR
                // On the desktop, we need to use the security rule set level 1 for anonymously hosted
                // dynamic methods.  In level 2, transparency rules are strictly enforced, which leads to
                // errors when a fully trusted application causes a dynamic method to be generated that tries
                // to call a method with a LinkDemand or a SecurityCritical method.  To retain compatibility
                // with the v2.0 and v3.x frameworks, these calls should be allowed.
                //
                // If this rule set was not explicitly called out, then the anonymously hosted dynamic methods
                // assembly would inherit the rule set from the creating assembly - which would cause it to
                // be level 2 because mscorlib.dll is using the level 2 rules.
                ConstructorInfo        securityRulesCtor      = typeof(SecurityRulesAttribute).GetConstructor(new Type[] { typeof(SecurityRuleSet) });
                CustomAttributeBuilder securityRulesAttribute =
                    new CustomAttributeBuilder(securityRulesCtor, new object[] { SecurityRuleSet.Level1 });
                assemblyAttributes.Add(securityRulesAttribute);
#endif // !FEATURE_CORECLR

                AssemblyName   assemblyName = new AssemblyName("Anonymously Hosted DynamicMethods Assembly");
                StackCrawlMark stackMark    = StackCrawlMark.LookForMe;

                AssemblyBuilder assembly = AssemblyBuilder.InternalDefineDynamicAssembly(
                    assemblyName,
                    AssemblyBuilderAccess.Run,
                    null, null, null, null, null,
                    ref stackMark,
                    assemblyAttributes,
                    SecurityContextSource.CurrentAssembly);

                AppDomain.PublishAnonymouslyHostedDynamicMethodsAssembly(assembly.GetNativeHandle());

                // this always gets the internal module.
                s_anonymouslyHostedDynamicMethodsModule = (InternalModuleBuilder)assembly.ManifestModule;
            }

            return(s_anonymouslyHostedDynamicMethodsModule);
        }