Merge pull request #495 from nicolas-raoul/fix-for-issue2907-with-no-formatting-changes
[mono.git] / mcs / class / corlib / System / AppDomain.cs
index 6f0bb7a798c905a09a49a7cace556f5ed7199e82..7032f7054f55087f31adcfc2bd611a1c760c7a4c 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
@@ -36,7 +37,9 @@ using System.Collections;
 using System.Globalization;
 using System.IO;
 using System.Reflection;
+#if !FULL_AOT_RUNTIME
 using System.Reflection.Emit;
+#endif
 using System.Threading;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
@@ -50,21 +53,30 @@ using System.Security.Policy;
 using System.Security.Principal;
 using System.Configuration.Assemblies;
 
-#if NET_2_0
 using System.Collections.Generic;
 using System.Runtime.ConstrainedExecution;
-#endif
+using System.Text;
 
 namespace System {
 
-#if NET_2_0
        [ComVisible (true)]
+#if !NET_2_1 || MOONLIGHT
        [ComDefaultInterface (typeof (_AppDomain))]
 #endif
        [ClassInterface(ClassInterfaceType.None)]
-       public sealed class AppDomain : MarshalByRefObject , _AppDomain , IEvidenceFactory
-       {
+       [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
+        #pragma warning disable 169
+        #region Sync with object-internals.h
                IntPtr _mono_app_domain;
+               #endregion
+        #pragma warning restore 169
                static string _process_guid;
 
                [ThreadStatic]
@@ -73,6 +85,9 @@ namespace System {
                [ThreadStatic]
                static Hashtable assembly_resolve_in_progress;
 
+               [ThreadStatic]
+               static Hashtable assembly_resolve_in_progress_refonly;
+#if !MOONLIGHT
                // CAS
                private Evidence _evidence;
                private PermissionSet _granted;
@@ -82,7 +97,7 @@ namespace System {
 
                [ThreadStatic]
                private static IPrincipal _principal;
-               
+#endif
                static AppDomain default_domain;
 
                private AppDomain ()
@@ -92,6 +107,9 @@ namespace System {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern AppDomainSetup getSetup ();
 
+#if NET_2_1
+               internal
+#endif
                AppDomainSetup SetupInformationNoCopy {
                        get { return getSetup (); }
                }
@@ -103,20 +121,22 @@ namespace System {
                        }
                }
 
-#if NET_2_0
+#if !NET_2_1
                [MonoTODO]
                public ApplicationTrust ApplicationTrust {
                        get { throw new NotImplementedException (); }
                }
 #endif
-
+#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;
                        }
                }
@@ -124,10 +144,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;
                        }
                }
@@ -139,10 +161,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;
                        }
                }
@@ -152,6 +176,7 @@ namespace System {
                                return (SetupInformationNoCopy.ShadowCopyFiles == "true");
                        }
                }
+#endif
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern string getFriendlyName ();
@@ -161,7 +186,7 @@ namespace System {
                                return getFriendlyName ();
                        }
                }
-
+#if !MOONLIGHT
                public Evidence Evidence {
                        get {
                                // if the host (runtime) hasn't provided it's own evidence...
@@ -209,6 +234,13 @@ namespace System {
                internal PermissionSet GrantedPermissionSet {
                        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 ();
@@ -235,9 +267,9 @@ namespace System {
                        }
                }
 
-#if NET_2_0
+#if !MOONLIGHT
+
                [Obsolete ("AppDomain.AppendPrivatePath has been deprecated. Please investigate the use of AppDomainSetup.PrivateBinPath instead.")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void AppendPrivatePath (string path)
                {
@@ -259,35 +291,32 @@ namespace System {
                        setup.PrivateBinPath = pp + path;
                }
 
-#if NET_2_0
                [Obsolete ("AppDomain.ClearPrivatePath has been deprecated. Please investigate the use of AppDomainSetup.PrivateBinPath instead.")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void ClearPrivatePath ()
                {
                        SetupInformationNoCopy.PrivateBinPath = String.Empty;
                }
 
-#if NET_2_0
                [Obsolete ("Use AppDomainSetup.ShadowCopyDirectories")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void ClearShadowCopyPath ()
                {
                        SetupInformationNoCopy.ShadowCopyDirectories = String.Empty;
                }
 
+#if !NET_2_1
                public ObjectHandle CreateComInstanceFrom (string assemblyName, string typeName)
                {
                        return Activator.CreateComInstanceFrom (assemblyName, typeName);
                }
 
-#if NET_1_1
                public ObjectHandle CreateComInstanceFrom (string assemblyFile, string typeName,
                        byte [] hashValue, AssemblyHashAlgorithm hashAlgorithm)
                {
                        return Activator.CreateComInstanceFrom (assemblyFile, typeName, hashValue ,hashAlgorithm);
                }
+#endif
 #endif
 
                public ObjectHandle CreateInstance (string assemblyName, string typeName)
@@ -306,6 +335,9 @@ namespace System {
                        return Activator.CreateInstance (assemblyName, typeName, activationAttributes);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase, BindingFlags bindingAttr,
                                                    Binder binder, object[] args, CultureInfo culture, object[] activationAttributes,
                                                    Evidence securityAttributes)
@@ -329,6 +361,9 @@ namespace System {
                        return (oh != null) ? oh.Unwrap () : null;
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase,
                                                       BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture,
                                                       object[] activationAttributes, Evidence securityAttributes)
@@ -338,6 +373,47 @@ namespace System {
                        return (oh != null) ? oh.Unwrap () : null;
                }
 
+#if NET_4_0
+               public ObjectHandle CreateInstance (string assemblyName, string typeName, bool ignoreCase, BindingFlags bindingAttr,
+                                                   Binder binder, object[] args, CultureInfo culture, object[] activationAttributes)
+               {
+                       if (assemblyName == null)
+                               throw new ArgumentNullException ("assemblyName");
+
+                       return Activator.CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args,
+                               culture, activationAttributes, null);
+               }
+               public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase,
+                                                      BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture,
+                                                      object[] activationAttributes)
+               {
+                       ObjectHandle oh = CreateInstance (assemblyName, typeName, ignoreCase, bindingAttr, binder, args,
+                               culture, activationAttributes);
+                       return (oh != null) ? oh.Unwrap () : null;
+               }
+
+               public ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
+                                                       BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture,
+                                                       object[] activationAttributes)
+               {
+                       if (assemblyFile == null)
+                               throw new ArgumentNullException ("assemblyFile");
+
+                       return Activator.CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args,
+                                                            culture, activationAttributes, null);
+               }
+
+               public object CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, bool ignoreCase,
+                                                          BindingFlags bindingAttr, Binder binder, object[] args,
+                                                          CultureInfo culture, object[] activationAttributes)
+               {
+                       ObjectHandle oh = CreateInstanceFrom (assemblyFile, typeName, ignoreCase, bindingAttr, binder, args,
+                               culture, activationAttributes);
+
+                       return (oh != null) ? oh.Unwrap () : null;
+               }
+#endif
+
                public ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName)
                {
                        if (assemblyFile == null)
@@ -354,6 +430,9 @@ namespace System {
                        return Activator.CreateInstanceFrom (assemblyFile, typeName, activationAttributes);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public ObjectHandle CreateInstanceFrom (string assemblyFile, string typeName, bool ignoreCase,
                                                        BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture,
                                                        object[] activationAttributes, Evidence securityAttributes)
@@ -377,6 +456,9 @@ namespace System {
                        return (oh != null) ? oh.Unwrap () : null;
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public object CreateInstanceFromAndUnwrap (string assemblyName, string typeName, bool ignoreCase,
                                                           BindingFlags bindingAttr, Binder binder, object[] args,
                                                           CultureInfo culture, object[] activationAttributes,
@@ -388,11 +470,15 @@ namespace System {
                        return (oh != null) ? oh.Unwrap () : null;
                }
 
+#if !FULL_AOT_RUNTIME
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access)
                {
                        return DefineDynamicAssembly (name, access, null, null, null, null, null, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, Evidence evidence)
                {
                        return DefineDynamicAssembly (name, access, null, evidence, null, null, null, false);
@@ -403,12 +489,18 @@ namespace System {
                        return DefineDynamicAssembly (name, access, dir, null, null, null, null, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir,
                                                              Evidence evidence)
                {
                        return DefineDynamicAssembly (name, access, dir, evidence, null, null, null, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access,
                                                              PermissionSet requiredPermissions,
                                                              PermissionSet optionalPermissions,
@@ -418,6 +510,9 @@ namespace System {
                                refusedPermissions, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, Evidence evidence,
                                                              PermissionSet requiredPermissions,
                                                              PermissionSet optionalPermissions,
@@ -427,6 +522,9 @@ namespace System {
                                refusedPermissions, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir,
                                                              PermissionSet requiredPermissions,
                                                              PermissionSet optionalPermissions,
@@ -436,6 +534,9 @@ namespace System {
                                refusedPermissions, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir,
                                                              Evidence evidence,
                                                              PermissionSet requiredPermissions,
@@ -446,6 +547,9 @@ namespace System {
                                refusedPermissions, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir,
                                                              Evidence evidence,
                                                              PermissionSet requiredPermissions,
@@ -463,8 +567,10 @@ namespace System {
                        return ab;
                }
 
-#if NET_2_0
                // NET 3.5 method
+#if NET_4_0
+               [Obsolete ("Declarative security for assembly level is no longer enforced")]
+#endif
                public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir,
                                                              Evidence evidence,
                                                              PermissionSet requiredPermissions,
@@ -480,16 +586,21 @@ 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);
                }
-#endif
 
-#if NET_2_1
-               // TODO: the last parameter is ignored for now
-               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, bool emitSymbolInfo)
+#if NET_4_0
+               public AssemblyBuilder DefineDynamicAssembly (AssemblyName name, AssemblyBuilderAccess access, string dir, bool isSynchronized, IEnumerable<CustomAttributeBuilder> assemblyAttributes)
                {
-                       return DefineDynamicAssembly (name, access, null, null, null, null, null, false);
+                       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
 
@@ -497,6 +608,7 @@ namespace System {
                {
                        return new AssemblyBuilder (name, null, access, true);
                }
+#endif
 
                //
                // AppDomain.DoCallBack works because AppDomain is a MarshalByRefObject
@@ -510,34 +622,54 @@ namespace System {
 
                public int ExecuteAssembly (string assemblyFile)
                {
-                       return ExecuteAssembly (assemblyFile, null, null);
+                       return ExecuteAssembly (assemblyFile, (Evidence)null, null);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssembly (string assemblyFile, Evidence assemblySecurity)
                {
                        return ExecuteAssembly (assemblyFile, assemblySecurity, null);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssembly (string assemblyFile, Evidence assemblySecurity, string[] args)
                {
                        Assembly a = Assembly.LoadFrom (assemblyFile, assemblySecurity);
                        return ExecuteAssemblyInternal (a, args);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssembly (string assemblyFile, Evidence assemblySecurity, string[] args, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
                {
                        Assembly a = Assembly.LoadFrom (assemblyFile, assemblySecurity, hashValue, hashAlgorithm);
                        return ExecuteAssemblyInternal (a, args);
                }
 
+
+#if NET_4_0
+               public int ExecuteAssembly (string assemblyFile, string[] args)
+               {
+                       Assembly a = Assembly.LoadFrom (assemblyFile, null);
+                       return ExecuteAssemblyInternal (a, args);
+               }
+
+               public int ExecuteAssembly (string assemblyFile, string[] args, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
+               {
+                       Assembly a = Assembly.LoadFrom (assemblyFile, null, hashValue, hashAlgorithm);
+                       return ExecuteAssemblyInternal (a, args);
+               }
+#endif
+
                int ExecuteAssemblyInternal (Assembly a, string[] args)
                {
                        if (a.EntryPoint == null)
-#if NET_2_0
                                throw new MissingMethodException ("Entry point not found in assembly '" + a.FullName + "'.");
-#else
-                               throw new COMException ("Unspecified error.", -2147467259);
-#endif
                        return ExecuteAssembly (a, args);
                }
 
@@ -560,10 +692,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);
@@ -573,6 +707,20 @@ namespace System {
                        return Load (assemblyRef, null);
                }
 
+               internal Assembly LoadSatellite (AssemblyName assemblyRef, bool throwOnError)
+               {
+                       if (assemblyRef == null)
+                               throw new ArgumentNullException ("assemblyRef");
+
+                       Assembly result = LoadAssembly (assemblyRef.FullName, null, false);
+                       if (result == null && throwOnError)
+                               throw new FileNotFoundException (null, assemblyRef.Name);
+                       return result;
+               }
+
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public Assembly Load (AssemblyName assemblyRef, Evidence assemblySecurity)
                {
                        if (assemblyRef == null)
@@ -585,16 +733,13 @@ namespace System {
                                        throw new ArgumentException (Locale.GetText ("assemblyRef.Name cannot be empty."), "assemblyRef");
                        }
 
-                       FileNotFoundException exc = null;
-                       try {
-                               return LoadAssembly (assemblyRef.FullName, assemblySecurity, false);
-                       } catch (FileNotFoundException e) {
-                               if (assemblyRef.CodeBase == null)
-                                       throw;
-                               exc = e;
-                       }
+                       Assembly assembly = LoadAssembly (assemblyRef.FullName, assemblySecurity, false);
+                       if (assembly != null)
+                               return assembly;
+
+                       if (assemblyRef.CodeBase == null)
+                               throw new FileNotFoundException (null, assemblyRef.Name);
 
-                       Assembly assembly = null;
                        string cb = assemblyRef.CodeBase;
                        if (cb.ToLower (CultureInfo.InvariantCulture).StartsWith ("file://"))
                                cb = new Mono.Security.Uri (cb).LocalPath;
@@ -602,27 +747,27 @@ namespace System {
                        try {
                                assembly = Assembly.LoadFrom (cb, assemblySecurity);
                        } catch {
-                               throw exc;
+                               throw new FileNotFoundException (null, assemblyRef.Name);
                        }
                        AssemblyName aname = assembly.GetName ();
                        // Name, version, culture, publickeytoken. Anything else?
                        if (assemblyRef.Name != aname.Name)
-                               throw exc;
+                               throw new FileNotFoundException (null, assemblyRef.Name);
 
-                       if (assemblyRef.Version != new Version () && assemblyRef.Version != aname.Version)
-                               throw exc;
+                       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 exc;
+                               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 exc;
+                                       throw new FileNotFoundException (null, assemblyRef.Name);
                                for (int i = pt.Length - 1; i >= 0; i--)
                                        if (loaded_pt [i] != pt [i])
-                                               throw exc;
+                                               throw new FileNotFoundException (null, assemblyRef.Name);
                        }
                        return assembly;
                }
@@ -632,6 +777,9 @@ namespace System {
                        return Load (assemblyString, null, false);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public Assembly Load (string assemblyString, Evidence assemblySecurity)
                {
                        return Load (assemblyString, assemblySecurity, false);
@@ -645,7 +793,10 @@ namespace System {
                        if (assemblyString.Length == 0)
                                throw new ArgumentException ("assemblyString cannot have zero length");
 
-                       return LoadAssembly (assemblyString, assemblySecurity, refonly);
+                       Assembly assembly = LoadAssembly (assemblyString, assemblySecurity, refonly);
+                       if (assembly == null)
+                               throw new FileNotFoundException (null, assemblyString);
+                       return assembly;
                }
 
                public Assembly Load (byte[] rawAssembly)
@@ -661,6 +812,9 @@ namespace System {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal extern Assembly LoadAssemblyRaw (byte[] rawAssembly, byte[] rawSymbolStore, Evidence securityEvidence, bool refonly);
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore, Evidence securityEvidence)
                {
                        return Load (rawAssembly, rawSymbolStore, securityEvidence, false);
@@ -675,7 +829,10 @@ namespace System {
                        assembly.FromByteArray = true;
                        return assembly;
                }
-
+#if !MOONLIGHT
+#if NET_4_0
+               [Obsolete ("AppDomain policy levels are obsolete")]
+#endif
                [SecurityPermission (SecurityAction.Demand, ControlPolicy = true)]
                public void SetAppDomainPolicy (PolicyLevel domainPolicy)
                {
@@ -692,9 +849,7 @@ namespace System {
                        _granted = ps.PermissionSet;
                }
 
-#if NET_2_0
                [Obsolete ("Use AppDomainSetup.SetCachePath")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void SetCachePath (string path)
                {
@@ -711,18 +866,14 @@ namespace System {
                        _principal = null;
                }
 
-#if NET_2_0
                [Obsolete ("Use AppDomainSetup.ShadowCopyFiles")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void SetShadowCopyFiles()
                {
                        SetupInformationNoCopy.ShadowCopyFiles = "true";
                }
 
-#if NET_2_0
                [Obsolete ("Use AppDomainSetup.ShadowCopyDirectories")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void SetShadowCopyPath (string path)
                {
@@ -741,7 +892,7 @@ namespace System {
 
                        _principal = principal;
                }
-
+#endif
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern AppDomain InternalSetDomainByID (int domain_id);
  
@@ -830,6 +981,8 @@ namespace System {
                        return _process_guid;
                }
 
+#if !MOONLIGHT
+
                public static AppDomain CreateDomain (string friendlyName)
                {
                        return CreateDomain (friendlyName, null, null);
@@ -843,7 +996,7 @@ namespace System {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern AppDomain createDomain (string friendlyName, AppDomainSetup info);
 
-               [MonoTODO ("Currently it does not allow the setup in the other domain")]
+               [MonoLimitationAttribute ("Currently it does not allow the setup in the other domain")]
                [SecurityPermission (SecurityAction.Demand, ControlAppDomain = true)]
                public static AppDomain CreateDomain (string friendlyName, Evidence securityInfo, AppDomainSetup info)
                {
@@ -873,6 +1026,15 @@ namespace System {
                        } else if (info.ConfigurationFile == null)
                                info.ConfigurationFile = "[I don't have a config file]";
 
+#if !NET_2_1
+                       if (info.AppDomainInitializer != null) {
+                               if (!info.AppDomainInitializer.Method.IsStatic)
+                                       throw new ArgumentException ("Non-static methods cannot be invoked as an appdomain initializer");
+                       }
+#endif
+
+                       info.SerializeNonPrimitives ();
+
                        AppDomain ad = (AppDomain) RemotingServices.GetDomainProxy (createDomain (friendlyName, info));
                        if (securityInfo == null) {
                                // get default domain's Evidence (unless we're are the default!)
@@ -884,11 +1046,8 @@ namespace System {
                        else
                                ad._evidence = new Evidence (securityInfo);     // copy
 
-#if NET_2_0
+#if !NET_2_1
                        if (info.AppDomainInitializer != null) {
-                               if (!info.AppDomainInitializer.Method.IsStatic)
-                                       throw new ArgumentException ("Non-static methods cannot be invoked as an appdomain initializer");
-
                                Loader loader = new Loader (
                                        info.AppDomainInitializer.Method.DeclaringType.Assembly.Location);
                                ad.DoCallBack (loader.Load);
@@ -903,7 +1062,7 @@ namespace System {
                        return ad;
                }
 
-#if NET_2_0
+#if !NET_2_1
                [Serializable]
                class Loader {
 
@@ -944,6 +1103,18 @@ namespace System {
                {
                        return CreateDomain (friendlyName, securityInfo, CreateDomainSetup (appBasePath, appRelativeSearchPath, shadowCopyFiles));
                }
+               
+#if !NET_2_1
+               public static AppDomain CreateDomain (string friendlyName, Evidence securityInfo, AppDomainSetup info,
+                                                     PermissionSet grantSet, params StrongName [] fullTrustAssemblies)
+               {
+                       if (info == null)
+                               throw new ArgumentNullException ("info");
+
+                       info.ApplicationTrust = new ApplicationTrust (grantSet, fullTrustAssemblies ?? new StrongName [0]);
+                       return CreateDomain (friendlyName, securityInfo, info);         
+               }
+#endif
 
                static AppDomainSetup CreateDomainSetup (string appBasePath, string appRelativeSearchPath, bool shadowCopyFiles)
                {
@@ -959,15 +1130,7 @@ namespace System {
 
                        return info;
                }
-
-#if NET_2_0
-               [MonoTODO]
-               public static AppDomain CreateDomain (string friendlyName, Evidence securityInfo, AppDomainSetup info,
-                                                     PermissionSet grantSet, params StrongName [] fullTrustAssemblies)
-               {
-                       throw new NotImplementedException ();
-               }
-#endif
+#endif // !NET_2_1
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private static extern bool InternalIsFinalizingForUnload (int domain_id);
@@ -988,9 +1151,7 @@ namespace System {
                }
 
                [SecurityPermission (SecurityAction.Demand, ControlAppDomain = true)]
-#if NET_2_0
                [ReliabilityContractAttribute (Consistency.MayCorruptAppDomain, Cer.MayFail)]
-#endif
                public static void Unload (AppDomain domain)
                {
                        if (domain == null)
@@ -1003,30 +1164,26 @@ namespace System {
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public extern void SetData (string name, object data);
 
-#if NET_2_0
-               [MonoTODO]
+               [MonoLimitation ("The permission field is ignored")]
                public void SetData (string name, object data, IPermission permission)
                {
-                       throw new NotImplementedException ();
+                       SetData (name, data);
                }
-#endif
 
-#if NET_2_0
+#if !NET_2_1
                [Obsolete ("Use AppDomainSetup.DynamicBase")]
-#endif
                [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public void SetDynamicBase (string path)
                {
                        SetupInformationNoCopy.DynamicBase = path;
                }
+#endif // !NET_2_1
 
-#if NET_2_0
                [Obsolete ("AppDomain.GetCurrentThreadId has been deprecated"
                        + " because it does not provide a stable Id when managed"
                        + " threads are running on fibers (aka lightweight"
                        + " threads). To get a stable identifier for a managed"
                        + " thread, use the ManagedThreadId property on Thread.'")]
-#endif
                public static int GetCurrentThreadId ()
                {
                        return Thread.CurrentThreadId;
@@ -1034,7 +1191,14 @@ namespace System {
 
                public override string ToString ()
                {
+#if !MOONLIGHT
                        return getFriendlyName ();
+#else
+                       StringBuilder sb = new StringBuilder ("Name:");
+                       sb.AppendLine (FriendlyName);
+                       sb.AppendLine ("There are no context policies.");
+                       return sb.ToString ();
+#endif
                }
 
                private static void ValidateAssemblyName (string name)
@@ -1082,7 +1246,7 @@ namespace System {
                private Assembly DoAssemblyResolve (string name, bool refonly)
                {
                        ResolveEventHandler del;
-#if NET_2_0
+#if !NET_2_1
                        if (refonly)
                                del = ReflectionOnlyAssemblyResolve;
                        else
@@ -1094,20 +1258,24 @@ namespace System {
                                return null;
                        
                        /* Prevent infinite recursion */
-                       Hashtable ht = assembly_resolve_in_progress;
-                       if (ht == null) {
-                               ht = new Hashtable ();
-                               assembly_resolve_in_progress = ht;
+                       Hashtable ht;
+                       if (refonly) {
+                               ht = assembly_resolve_in_progress_refonly;
+                               if (ht == null) {
+                                       ht = new Hashtable ();
+                                       assembly_resolve_in_progress_refonly = ht;
+                               }
+                       } else {
+                               ht = assembly_resolve_in_progress;
+                               if (ht == null) {
+                                       ht = new Hashtable ();
+                                       assembly_resolve_in_progress = ht;
+                               }
                        }
 
-                       Assembly ass = (Assembly) ht [name];
-#if NET_2_0
-                       if (ass != null && (ass.ReflectionOnly == refonly))
-                               return null;
-#else
-                       if (ass != null)
+                       string s = (string) ht [name];
+                       if (s != null)
                                return null;
-#endif
                        ht [name] = name;
                        try {
                                Delegate[] invocation_list = del.GetInvocationList ();
@@ -1132,9 +1300,11 @@ namespace System {
 
                        string name;
 
+#if !FULL_AOT_RUNTIME
                        if (name_or_tb is TypeBuilder)
                                name = ((TypeBuilder) name_or_tb).FullName;
                        else
+#endif
                                name = (string) name_or_tb;
 
                        /* Prevent infinite recursion */
@@ -1163,6 +1333,25 @@ 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)
@@ -1194,28 +1383,11 @@ namespace System {
                        else
                                arrResponse = null;
                }
+
 #pragma warning restore 169
 
                // End of methods called from the runtime
                
-#if BOOTSTRAP_WITH_OLDLIB
-               // older MCS/corlib returns:
-               // _AppDomain.cs(138) error CS0592: Attribute 'SecurityPermission' is not valid on this declaration type.
-               // It is valid on 'assembly' 'class' 'constructor' 'method' 'struct'  declarations only.
-               public event AssemblyLoadEventHandler AssemblyLoad;
-
-               public event ResolveEventHandler AssemblyResolve;
-
-               public event EventHandler DomainUnload;
-
-               public event EventHandler ProcessExit;
-
-               public event ResolveEventHandler ResourceResolve;
-
-               public event ResolveEventHandler TypeResolve;
-
-               public event UnhandledExceptionEventHandler UnhandledException;
-#else
                [method: SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public event AssemblyLoadEventHandler AssemblyLoad;
 
@@ -1236,15 +1408,36 @@ namespace System {
 
                [method: SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
                public event UnhandledExceptionEventHandler UnhandledException;
+
+#if NET_4_0
+               [MonoTODO]
+               public bool IsHomogenous {
+                       get { return true; }
+               }
+
+               [MonoTODO]
+               public bool IsFullyTrusted {
+                       get { return true; }
+               }
 #endif
 
-#if NET_2_0
+        #pragma warning disable 649
+               private AppDomainManager _domain_manager;
+        #pragma warning restore 649
+
+               // default is null
+               public AppDomainManager DomainManager {
+                       get { return _domain_manager; }
+               }
+
+#if (!MOONLIGHT)
 
                public event ResolveEventHandler ReflectionOnlyAssemblyResolve;
-               
+
+        #pragma warning disable 649
                private ActivationContext _activation;
                private ApplicationIdentity _applicationIdentity;
-               private AppDomainManager _domain_manager;
+        #pragma warning restore 649
 
                // properties
 
@@ -1256,11 +1449,6 @@ namespace System {
                        get { return _applicationIdentity; }
                }
 
-               // default is null
-               public AppDomainManager DomainManager {
-                       get { return _domain_manager; }
-               }
-
                public int Id {
                        [ReliabilityContract (Consistency.WillNotCorruptState, Cer.Success)]
                        get { return getDomainID (); }
@@ -1294,14 +1482,20 @@ namespace System {
 
                public int ExecuteAssemblyByName (string assemblyName)
                {
-                       return ExecuteAssemblyByName (assemblyName, null, null);
+                       return ExecuteAssemblyByName (assemblyName, (Evidence)null, null);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssemblyByName (string assemblyName, Evidence assemblySecurity)
                {
                        return ExecuteAssemblyByName (assemblyName, assemblySecurity, null);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssemblyByName (string assemblyName, Evidence assemblySecurity, params string[] args)
                {
                        Assembly a = Assembly.Load (assemblyName, assemblySecurity);
@@ -1309,6 +1503,9 @@ namespace System {
                        return ExecuteAssemblyInternal (a, args);
                }
 
+#if NET_4_0
+               [Obsolete ("Use an overload that does not take an Evidence parameter")]
+#endif
                public int ExecuteAssemblyByName (AssemblyName assemblyName, Evidence assemblySecurity, params string[] args)
                {
                        Assembly a = Assembly.Load (assemblyName, assemblySecurity);
@@ -1316,6 +1513,22 @@ namespace System {
                        return ExecuteAssemblyInternal (a, args);
                }
 
+#if NET_4_0
+               public int ExecuteAssemblyByName (string assemblyName, params string[] args)
+               {
+                       Assembly a = Assembly.Load (assemblyName, null);
+
+                       return ExecuteAssemblyInternal (a, args);
+               }
+
+               public int ExecuteAssemblyByName (AssemblyName assemblyName, params string[] args)
+               {
+                       Assembly a = Assembly.Load (assemblyName, null);
+
+                       return ExecuteAssemblyInternal (a, args);
+               }
+#endif
+
                public bool IsDefaultAppDomain ()
                {
                        return Object.ReferenceEquals (this, DefaultDomain);
@@ -1325,9 +1538,17 @@ namespace System {
                {
                        return GetAssemblies (true);
                }
+
+#else // MOONLIGHT
+
+               public int ExecuteAssemblyByName (string assemblyName)
+               {
+                       // critical code in SL that we're not calling in ML
+                       throw new NotImplementedException ();
+               }
 #endif
 
-#if NET_1_1
+#if !NET_2_1
                void _AppDomain.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
                {
                        throw new NotImplementedException ();
@@ -1349,5 +1570,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
        }
 }