Add all missing sequential layout directives to corlib and system.
[mono.git] / mcs / class / corlib / System / AppDomain.cs
index 852bbe9ebefdefadbe77fdfab13001c6020aae32..1cb3be10c3b1f38d18927ba40542778ddb35b3a2 100644 (file)
@@ -11,6 +11,7 @@
 //
 // (C) 2001, 2002 Ximian, Inc.  http://www.ximian.com
 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright 2011 Xamarin Inc (http://www.xamarin.com).
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -57,12 +58,15 @@ using System.Text;
 namespace System {
 
        [ComVisible (true)]
-#if !NET_2_1
+#if !NET_2_1 || MOONLIGHT
        [ComDefaultInterface (typeof (_AppDomain))]
 #endif
        [ClassInterface(ClassInterfaceType.None)]
-#if NET_2_1
-       public sealed class AppDomain : MarshalByRefObject {
+       [StructLayout (LayoutKind.Sequential)]
+#if MOONLIGHT
+       public sealed class AppDomain : _AppDomain {
+#elif NET_2_1
+       public sealed class AppDomain : MarshalByRefObject, _AppDomain {
 #else
        public sealed class AppDomain : MarshalByRefObject, _AppDomain, IEvidenceFactory {
 #endif
@@ -81,7 +85,7 @@ namespace System {
 
                [ThreadStatic]
                static Hashtable assembly_resolve_in_progress_refonly;
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
                // CAS
                private Evidence _evidence;
                private PermissionSet _granted;
@@ -121,14 +125,16 @@ namespace System {
                        get { throw new NotImplementedException (); }
                }
 #endif
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
                public string BaseDirectory {
                        get {
                                string path = SetupInformationNoCopy.ApplicationBase;
+#if !NET_2_1
                                if (SecurityManager.SecurityEnabled && (path != null) && (path.Length > 0)) {
                                        // we cannot divulge local file informations
                                        new FileIOPermission (FileIOPermissionAccess.PathDiscovery, path).Demand ();
                                }
+#endif
                                return path;
                        }
                }
@@ -136,10 +142,12 @@ namespace System {
                public string RelativeSearchPath {
                        get {
                                string path = SetupInformationNoCopy.PrivateBinPath;
+#if !NET_2_1
                                if (SecurityManager.SecurityEnabled && (path != null) && (path.Length > 0)) {
                                        // we cannot divulge local file informations
                                        new FileIOPermission (FileIOPermissionAccess.PathDiscovery, path).Demand ();
                                }
+#endif
                                return path;
                        }
                }
@@ -151,10 +159,12 @@ namespace System {
                                        return null;
 
                                string path = Path.Combine (setup.DynamicBase, setup.ApplicationName);
+#if !NET_2_1
                                if (SecurityManager.SecurityEnabled && (path != null) && (path.Length > 0)) {
                                        // we cannot divulge local file informations
                                        new FileIOPermission (FileIOPermissionAccess.PathDiscovery, path).Demand ();
                                }
+#endif
                                return path;
                        }
                }
@@ -174,7 +184,7 @@ namespace System {
                                return getFriendlyName ();
                        }
                }
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
                public Evidence Evidence {
                        get {
                                // if the host (runtime) hasn't provided it's own evidence...
@@ -223,6 +233,13 @@ namespace System {
                        get { return _granted; }
                }
 #endif
+
+#if NET_4_0
+               public PermissionSet PermissionSet {
+                       get { return _granted ?? (_granted = new PermissionSet (PermissionState.Unrestricted)); }
+               }
+#endif
+
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern AppDomain getCurDomain ();
                
@@ -248,7 +265,7 @@ namespace System {
                        }
                }
 
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
 
                [Obsolete ("AppDomain.AppendPrivatePath has been deprecated. Please investigate the use of AppDomainSetup.PrivateBinPath instead.")]
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
@@ -383,11 +400,11 @@ namespace System {
                                                             culture, activationAttributes, null);
                }
 
-               public object CreateInstanceFromAndUnwrap (string assemblyName, string typeName, bool ignoreCase,
+               public object CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, bool ignoreCase,
                                                           BindingFlags bindingAttr, Binder binder, object[] args,
                                                           CultureInfo culture, object[] activationAttributes)
                {
-                       ObjectHandle oh = CreateInstanceFrom (assemblyName, typeName, ignoreCase, bindingAttr, binder, args,
+                       ObjectHandle oh = CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args,
                                culture, activationAttributes);
 
                        return (oh != null) ? oh.Unwrap () : null;
@@ -567,10 +584,24 @@ namespace System {
                }
 
                // NET 3.5 method
-               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, IEnumerable<CustomAttributeBuilder> assemblyAttributes) {
+               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, IEnumerable<CustomAttributeBuilder> assemblyAttributes)
+               {
                        return DefineDynamicAssembly (name, access, null, null, null, null, null, false, assemblyAttributes);
                }
 
+#if NET_4_0
+               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir, bool isSynchronized, IEnumerable<CustomAttributeBuilder> assemblyAttributes)
+               {
+                       return DefineDynamicAssembly (name, access, dir, null, null, null, null, isSynchronized, assemblyAttributes);
+               }
+
+               [MonoLimitation ("The argument securityContextSource is ignored")]
+               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, IEnumerable<CustomAttributeBuilder> assemblyAttributes, SecurityContextSource securityContextSource)
+               {
+                       return DefineDynamicAssembly (name, access, assemblyAttributes);
+               }
+#endif
+
                internal AssemblyBuilder DefineInternalDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access)
                {
                        return new AssemblyBuilder (name, null, access, true);
@@ -658,10 +689,12 @@ namespace System {
                        return base.GetType ();
                }
 
+#if !MOONLIGHT
                public override object InitializeLifetimeService ()
                {
                        return null;
                }
+#endif
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal extern Assembly LoadAssembly (string assemblyRef, Evidence securityEvidence, bool refOnly);
@@ -718,14 +751,14 @@ namespace System {
                        if (assemblyRef.Name != aname.Name)
                                throw new FileNotFoundException (null, assemblyRef.Name);
 
-                       if (assemblyRef.Version != new Version () && assemblyRef.Version != aname.Version)
+                       if (assemblyRef.Version != null && assemblyRef.Version != new Version (0, 0, 0, 0) && assemblyRef.Version != aname.Version)
                                throw new FileNotFoundException (null, assemblyRef.Name);
 
                        if (assemblyRef.CultureInfo != null && assemblyRef.CultureInfo.Equals (aname))
                                throw new FileNotFoundException (null, assemblyRef.Name);
 
                        byte [] pt = assemblyRef.GetPublicKeyToken ();
-                       if (pt != null) {
+                       if (pt != null && pt.Length != 0) {
                                byte [] loaded_pt = aname.GetPublicKeyToken ();
                                if (loaded_pt == null || (pt.Length != loaded_pt.Length))
                                        throw new FileNotFoundException (null, assemblyRef.Name);
@@ -793,7 +826,7 @@ namespace System {
                        assembly.FromByteArray = true;
                        return assembly;
                }
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
 #if NET_4_0
                [Obsolete ("AppDomain policy levels are obsolete")]
 #endif
@@ -945,7 +978,7 @@ namespace System {
                        return _process_guid;
                }
 
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
 
                public static AppDomain CreateDomain (string friendlyName)
                {
@@ -1155,7 +1188,7 @@ namespace System {
 
                public override string ToString ()
                {
-#if !NET_2_1 || MONOTOUCH
+#if !MOONLIGHT
                        return getFriendlyName ();
 #else
                        StringBuilder sb = new StringBuilder ("Name:");
@@ -1295,19 +1328,37 @@ namespace System {
                        }
                }
 
+               internal Assembly DoResourceResolve (string name, Assembly requesting) {
+                       if (ResourceResolve == null)
+                               return null;
+
+                       Delegate[] invocation_list = ResourceResolve.GetInvocationList ();
+
+                       foreach (Delegate eh in invocation_list) {
+                               ResolveEventHandler handler = (ResolveEventHandler) eh;
+#if NET_4_0
+                               Assembly assembly = handler (this, new ResolveEventArgs (name, requesting));
+#else
+                               Assembly assembly = handler (this, new ResolveEventArgs (name));
+#endif
+                               if (assembly != null)
+                                       return assembly;
+                       }
+                       return null;
+               }
+
                private void DoDomainUnload ()
                {
                        if (DomainUnload != null)
                                DomainUnload(this, null);
                }
 
-#if !NET_2_1
                internal byte[] GetMarshalledDomainObjRef ()
                {
                        ObjRef oref = RemotingServices.Marshal (AppDomain.CurrentDomain, null, typeof (AppDomain));
                        return CADSerializer.SerializeObject (oref).GetBuffer();
                }
-#endif
+
                internal void ProcessMessageInDomain (byte[] arrRequest, CADMethodCallMessage cadMsg,
                                                      out byte[] arrResponse, out CADMethodReturnMessage cadMrm)
                {
@@ -1353,11 +1404,16 @@ namespace System {
                [method: SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public event UnhandledExceptionEventHandler UnhandledException;
 
-#if NET_4_0 || BOOTSTRAP_NET_4_0
+#if NET_4_0
                [MonoTODO]
                public bool IsHomogenous {
                        get { return true; }
                }
+
+               [MonoTODO]
+               public bool IsFullyTrusted {
+                       get { return true; }
+               }
 #endif
 
         #pragma warning disable 649
@@ -1369,7 +1425,7 @@ namespace System {
                        get { return _domain_manager; }
                }
 
-#if (!NET_2_1 || MONOTOUCH)
+#if (!MOONLIGHT)
 
                public event ResolveEventHandler ReflectionOnlyAssemblyResolve;
 
@@ -1477,9 +1533,9 @@ namespace System {
                {
                        return GetAssemblies (true);
                }
-#endif
 
-#if NET_2_1 && !MONOTOUCH
+#else // MOONLIGHT
+
                public int ExecuteAssemblyByName (string assemblyName)
                {
                        // critical code in SL that we're not calling in ML
@@ -1509,5 +1565,51 @@ namespace System {
                        throw new NotImplementedException ();
                }
 #endif
+
+#if NET_4_0 || MOONLIGHT || MOBILE
+               List<string> compatibility_switch;
+
+               public bool? IsCompatibilitySwitchSet (string value)
+               {
+                       if (value == null)
+                               throw new ArgumentNullException ("value");
+
+                       // default (at least for SL4) is to return false for unknown values (can't get a null out of it)
+                       return ((compatibility_switch != null) && compatibility_switch.Contains (value));
+               }
+
+               internal void SetCompatibilitySwitch (string value)
+               {
+                       if (compatibility_switch == null)
+                               compatibility_switch = new List<string> ();
+                       compatibility_switch.Add (value);
+               }
+
+               [MonoTODO ("Currently always returns false")]
+               public static bool MonitoringIsEnabled { 
+                       get { return false; }
+                       set { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public long MonitoringSurvivedMemorySize {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public static long MonitoringSurvivedProcessMemorySize {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public long MonitoringTotalAllocatedMemorySize {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public TimeSpan MonitoringTotalProcessorTime {
+                       get { throw new NotImplementedException (); }
+               }
+#endif
        }
 }