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