2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Reflection.Emit / AssemblyBuilder.cs
index fd26a3ef1df7520703f11173a1031ace15557668..b4dacd032be0d94e7909a25122020a64a42591e5 100755 (executable)
@@ -100,6 +100,12 @@ namespace System.Reflection.Emit {
                uint access;
                Module[] loaded_modules;
                MonoWin32Resource[] win32_resources;
+               private RefEmitPermissionSet[] permissions_minimum;
+               private RefEmitPermissionSet[] permissions_optional;
+               private RefEmitPermissionSet[] permissions_refused;
+               PortableExecutableKind peKind;
+               ImageFileMachine machine;
+               bool corlib_internal;
                #endregion
                internal Type corlib_object_type = typeof (System.Object);
                internal Type corlib_value_type = typeof (System.ValueType);
@@ -110,12 +116,11 @@ namespace System.Reflection.Emit {
                bool created;
                bool is_module_only;
                private Mono.Security.StrongName sn;
-               PermissionSet required_perm, optional_perm, refused_perm;
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern void basic_init (AssemblyBuilder ab);
                
-               internal AssemblyBuilder (AssemblyName n, string directory, AssemblyBuilderAccess access) {
+               internal AssemblyBuilder (AssemblyName n, string directory, AssemblyBuilderAccess access, bool corlib_internal) {
                        name = n.Name;
                        if (directory == null || directory == String.Empty)
                                dir = Directory.GetCurrentDirectory ();
@@ -144,6 +149,8 @@ namespace System.Reflection.Emit {
                                }
                        }
 
+                       this.corlib_internal = corlib_internal;
+
                        basic_init (this);
                }
 
@@ -209,15 +216,34 @@ namespace System.Reflection.Emit {
                /// <summary>
                /// Don't change the method name and parameters order. It is used by mcs 
                /// </summary>
-               [MonoTODO ("Missing support in runtime for parameter applying")]
                internal void AddPermissionRequests (PermissionSet required, PermissionSet optional, PermissionSet refused)
                {
                        if (created)
                                throw new InvalidOperationException ("Assembly was already saved.");
 
-                       required_perm = required;
-                       optional_perm = optional;
-                       refused_perm = refused;
+                       // required for base Assembly class (so the permissions
+                       // can be used even if the assembly isn't saved to disk)
+                       _minimum = required;
+                       _optional = optional;
+                       _refuse = refused;
+
+                       // required to reuse AddDeclarativeSecurity support 
+                       // already present in the runtime
+                       if (required != null) {
+                               permissions_minimum = new RefEmitPermissionSet [1];
+                               permissions_minimum [0] = new RefEmitPermissionSet (
+                                       SecurityAction.RequestMinimum, required.ToXml ().ToString ());
+                       }
+                       if (optional != null) {
+                               permissions_optional = new RefEmitPermissionSet [1];
+                               permissions_optional [0] = new RefEmitPermissionSet (
+                                       SecurityAction.RequestOptional, optional.ToXml ().ToString ());
+                       }
+                       if (refused != null) {
+                               permissions_refused = new RefEmitPermissionSet [1];
+                               permissions_refused [0] = new RefEmitPermissionSet (
+                                       SecurityAction.RequestRefuse, refused.ToXml ().ToString ());
+                       }
                }
 
                internal void EmbedResourceFile (string name, string fileName)
@@ -567,8 +593,16 @@ namespace System.Reflection.Emit {
                        }
                }
 
-               public void Save (string assemblyFileName)
+#if NET_2_0
+               public 
+#else
+               internal
+#endif
+               void Save (string assemblyFileName, PortableExecutableKind portableExecutableKind, ImageFileMachine imageFileMachine)
                {
+                       this.peKind = portableExecutableKind;
+                       this.machine = imageFileMachine;
+
                        if (resource_writers != null) {
                                foreach (IResourceWriter writer in resource_writers) {
                                        writer.Generate ();
@@ -634,6 +668,11 @@ namespace System.Reflection.Emit {
                        created = true;
                }
 
+               public void Save (string assemblyFileName)
+               {
+                       Save (assemblyFileName, PortableExecutableKind.ILOnly, ImageFileMachine.I386);
+               }
+
                public void SetEntryPoint (MethodInfo entryMethod)
                {
                        SetEntryPoint (entryMethod, PEFileKinds.ConsoleApplication);