[corlib] Remove multiple appdomain support (AppDomain.CreateDomain, etc) from tvOS...
[mono.git] / mcs / class / corlib / System / AppDomainSetup.cs
index 5320c086cf95d79ad49175e055fc485b07021819..b3e2d510138af5bcc9b4fafc390304de7cd1a159 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.Collections.Generic;
 using System.IO;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Security;
+using System.Runtime.Serialization.Formatters.Binary;
 
-#if NET_2_0
 using System.Runtime.Hosting;
 using System.Security.Policy;
-#endif
 
 namespace System
 {
        [Serializable]
        [ClassInterface (ClassInterfaceType.None)]
-#if NET_2_0
        [ComVisible (true)]
-#endif
+       [StructLayout (LayoutKind.Sequential)]
 #if NET_2_1
        public sealed class AppDomainSetup
 #else
@@ -66,25 +65,31 @@ namespace System
                string shadow_copy_files;
                bool publisher_policy;
                private bool path_changed;
+#if MOBILE
+               private int loader_optimization;
+#else
                private LoaderOptimization loader_optimization;
+#endif
                bool disallow_binding_redirects;
                bool disallow_code_downloads;
 
-               // those fields also exist in the runtime, so we need dummies in 1.x profile too.
-#if NET_2_0
+#if MOBILE
+               object _activationArguments;
+               object domain_initializer;
+               object application_trust;
+#else
                private ActivationArguments _activationArguments;
                AppDomainInitializer domain_initializer;
                [NonSerialized]
                ApplicationTrust application_trust;
-#else
-               object _activationArguments;
-               object domain_initializer; // always null
 #endif
                string [] domain_initializer_args;
-               SecurityElement application_trust_xml;
+
                bool disallow_appbase_probe;
                byte [] configuration_bytes;
 
+               byte [] serialized_non_primitives;
+
                public AppDomainSetup ()
                {
                }
@@ -106,17 +111,14 @@ namespace System
                        loader_optimization = setup.loader_optimization;
                        disallow_binding_redirects = setup.disallow_binding_redirects;
                        disallow_code_downloads = setup.disallow_code_downloads;
-//#if NET_2_0
                        _activationArguments = setup._activationArguments;
                        domain_initializer = setup.domain_initializer;
+                       application_trust = setup.application_trust;
                        domain_initializer_args = setup.domain_initializer_args;
-                       application_trust_xml = setup.application_trust_xml;
                        disallow_appbase_probe = setup.disallow_appbase_probe;
                        configuration_bytes = setup.configuration_bytes;
-//#endif
                }
 
-#if NET_2_0
                public AppDomainSetup (ActivationArguments activationArguments)
                {
                        _activationArguments = activationArguments;
@@ -126,7 +128,6 @@ namespace System
                {
                        _activationArguments = new ActivationArguments (activationContext);
                }
-#endif
 
                static string GetAppBase (string appBase)
                {
@@ -142,12 +143,7 @@ namespace System
                                        // Under Windows prepend "//" to indicate it's a local file
                                        appBase = "//" + appBase;
                                }
-#if NET_2_0
                        } else {
-#else
-                       // under 1.x the ":" gets a special treatment - but it doesn't make sense outside Windows
-                       } else if (!Environment.IsRunningOnWindows || (appBase.IndexOf (':') == -1)) {
-#endif
                                appBase = Path.GetFullPath (appBase);
                        }
 
@@ -231,13 +227,17 @@ namespace System
                        }
                }
 
-               [MonoTODO ("In Mono this is controlled by the --share-code flag")]
+               [MonoLimitation ("In Mono this is controlled by the --share-code flag")]
                public LoaderOptimization LoaderOptimization {
                        get {
-                               return loader_optimization;
+                               return (LoaderOptimization)loader_optimization;
                        }
                        set {
+#if MOBILE
+                               loader_optimization = (int)value;
+#else
                                loader_optimization = value;
+#endif
                        }
                }
 
@@ -279,7 +279,6 @@ namespace System
                        }
                }
 
-#if NET_1_1
                public bool DisallowBindingRedirects {
                        get {
                                return disallow_binding_redirects;
@@ -297,19 +296,38 @@ namespace System
                                disallow_code_downloads = value;
                        }
                }
-#endif
 
-#if NET_2_0
+               public string TargetFrameworkName { get; set; }
+
                public ActivationArguments ActivationArguments {
-                       get { return _activationArguments; }
+                       get {
+                               if (_activationArguments != null)
+                                       return (ActivationArguments)_activationArguments;
+                               DeserializeNonPrimitives ();
+                               return (ActivationArguments)_activationArguments;
+                       }
                        set { _activationArguments = value; }
                }
 
+#if MONO_FEATURE_MULTIPLE_APPDOMAINS
                [MonoLimitation ("it needs to be invoked within the created domain")]
                public AppDomainInitializer AppDomainInitializer {
-                       get { return domain_initializer; }
+                       get {
+                               if (domain_initializer != null)
+                                       return (AppDomainInitializer)domain_initializer;
+                               DeserializeNonPrimitives ();
+                               return (AppDomainInitializer)domain_initializer;
+                       }
                        set { domain_initializer = value; }
                }
+#else
+               [Obsolete ("AppDomainSetup.AppDomainInitializer is not supported on this platform.", true)]
+               public AppDomainInitializer AppDomainInitializer {
+                       get { throw new PlatformNotSupportedException ("AppDomainSetup.AppDomainInitializer is not supported on this platform."); }
+                       set { throw new PlatformNotSupportedException ("AppDomainSetup.AppDomainInitializer is not supported on this platform."); }
+               }
+#endif // MONO_FEATURE_MULTIPLE_APPDOMAINS
+
 
                [MonoLimitation ("it needs to be used to invoke the initializer within the created domain")]
                public string [] AppDomainInitializerArguments {
@@ -320,21 +338,14 @@ namespace System
                [MonoNotSupported ("This property exists but not considered.")]
                public ApplicationTrust ApplicationTrust {
                        get {
-                               if (application_trust_xml == null)
-                                       return null;
+                               if (application_trust != null)
+                                       return (ApplicationTrust)application_trust;
+                               DeserializeNonPrimitives ();
                                if (application_trust == null)
                                        application_trust = new ApplicationTrust ();
-                               return application_trust;
-                       }
-                       set {
-                               application_trust = value;
-                               if (value != null) {
-                                       application_trust_xml = value.ToXml ();
-                                       application_trust.FromXml (application_trust_xml);
-                               }
-                               else
-                                       application_trust_xml = null;
+                               return (ApplicationTrust)application_trust;
                        }
+                       set { application_trust = value; }
                }
 
                [MonoNotSupported ("This property exists but not considered.")]
@@ -354,6 +365,47 @@ namespace System
                {
                        configuration_bytes = value;
                }
+
+               private void DeserializeNonPrimitives ()
+               {
+                       lock (this) {
+                               if (serialized_non_primitives == null)
+                                       return;
+
+                               BinaryFormatter bf = new BinaryFormatter ();
+                               MemoryStream ms = new MemoryStream (serialized_non_primitives);
+
+                               object [] arr = (object []) bf.Deserialize (ms);
+
+                               _activationArguments = (ActivationArguments) arr [0];
+#if MONO_FEATURE_MULTIPLE_APPDOMAINS
+                               domain_initializer = (AppDomainInitializer) arr [1];
 #endif
+                               application_trust = (ApplicationTrust) arr [2];
+
+                               serialized_non_primitives = null;
+                       }
+               }
+
+               internal void SerializeNonPrimitives ()
+               {
+                       object [] arr = new object [3];
+
+                       arr [0] = _activationArguments;
+                       arr [1] = domain_initializer;
+                       arr [2] = application_trust;
+
+                       BinaryFormatter bf = new BinaryFormatter ();
+                       MemoryStream ms = new MemoryStream ();
+
+                       bf.Serialize (ms, arr);
+
+                       serialized_non_primitives = ms.ToArray ();
+               }
+
+               [MonoTODO ("not implemented, does not throw because it's used in testing moonlight")]
+               public void SetCompatibilitySwitches (IEnumerable<string> switches)
+               {
+               }
        }
 }