//
// System.AppDomainSetup.cs
//
-// Author:
-// Dietmar Maurer (dietmar@ximian.com)
+// Authors:
+// Dietmar Maurer (dietmar@ximian.com)
+// Sebastien Pouliot <sebastien@ximian.com>
//
// (C) 2001 Ximian, Inc. http://www.ximian.com
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Known Problems:
+// Fix serialization compatibility with MS.NET.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// 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;
+
+using System.Runtime.Hosting;
+using System.Security.Policy;
namespace System
{
[Serializable]
[ClassInterface (ClassInterfaceType.None)]
- [MonoTODO ("Fix serialization compatibility with MS.NET")]
+ [ComVisible (true)]
+ [StructLayout (LayoutKind.Sequential)]
+#if NET_2_1
+ public sealed class AppDomainSetup
+#else
public sealed class AppDomainSetup : IAppDomainSetup
+#endif
{
string application_base;
string application_name;
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;
+#if MOBILE
+ object _activationArguments;
+ object domain_initializer;
+ object application_trust;
+#else
+ private ActivationArguments _activationArguments;
+ AppDomainInitializer domain_initializer;
+ [NonSerialized]
+ ApplicationTrust application_trust;
+#endif
+ string [] domain_initializer_args;
+
+ bool disallow_appbase_probe;
+ byte [] configuration_bytes;
+
+ byte [] serialized_non_primitives;
+
public AppDomainSetup ()
{
}
loader_optimization = setup.loader_optimization;
disallow_binding_redirects = setup.disallow_binding_redirects;
disallow_code_downloads = setup.disallow_code_downloads;
+ _activationArguments = setup._activationArguments;
+ domain_initializer = setup.domain_initializer;
+ application_trust = setup.application_trust;
+ domain_initializer_args = setup.domain_initializer_args;
+ disallow_appbase_probe = setup.disallow_appbase_probe;
+ configuration_bytes = setup.configuration_bytes;
+ }
+
+ public AppDomainSetup (ActivationArguments activationArguments)
+ {
+ _activationArguments = activationArguments;
+ }
+
+ public AppDomainSetup (ActivationContext activationContext)
+ {
+ _activationArguments = new ActivationArguments (activationContext);
}
static string GetAppBase (string appBase)
{
- if (appBase == null) return null;
+ if (appBase == null)
+ return null;
+
int len = appBase.Length;
if (len >= 8 && appBase.ToLower ().StartsWith ("file://")) {
appBase = appBase.Substring (7);
if (Path.DirectorySeparatorChar != '/')
appBase = appBase.Replace ('/', Path.DirectorySeparatorChar);
-
- } else if (appBase.IndexOf (':') == -1) {
+ if (Environment.IsRunningOnWindows) {
+ // Under Windows prepend "//" to indicate it's a local file
+ appBase = "//" + appBase;
+ }
+ } else {
appBase = Path.GetFullPath (appBase);
}
return appBase;
}
-
+
public string ApplicationBase {
- get {
- return application_base;
- }
- set {
- application_base = GetAppBase (value);
- }
+ get { return GetAppBase (application_base); }
+ set { application_base = value; }
}
public string ApplicationName {
public string ConfigurationFile {
get {
- return configuration_file;
+ if (configuration_file == null)
+ return null;
+ if (Path.IsPathRooted(configuration_file))
+ return configuration_file;
+ if (ApplicationBase == null)
+ throw new MemberAccessException("The ApplicationBase must be set before retrieving this property.");
+ return Path.Combine(ApplicationBase, configuration_file);
}
set {
configuration_file = value;
}
}
- [MonoTODO ("--share-code")]
+ [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
}
}
}
}
-#if NET_1_1
public bool DisallowBindingRedirects {
get {
return disallow_binding_redirects;
disallow_code_downloads = value;
}
}
+
+ public string TargetFrameworkName { get; set; }
+
+ public ActivationArguments 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 {
+ 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 {
+ get { return domain_initializer_args; }
+ set { domain_initializer_args = value; }
+ }
+
+ [MonoNotSupported ("This property exists but not considered.")]
+ public ApplicationTrust ApplicationTrust {
+ get {
+ if (application_trust != null)
+ return (ApplicationTrust)application_trust;
+ DeserializeNonPrimitives ();
+ if (application_trust == null)
+ application_trust = new ApplicationTrust ();
+ return (ApplicationTrust)application_trust;
+ }
+ set { application_trust = value; }
+ }
+
+ [MonoNotSupported ("This property exists but not considered.")]
+ public bool DisallowApplicationBaseProbing {
+ get { return disallow_appbase_probe; }
+ set { disallow_appbase_probe = value; }
+ }
+
+ [MonoNotSupported ("This method exists but not considered.")]
+ public byte [] GetConfigurationBytes ()
+ {
+ return configuration_bytes != null ? configuration_bytes.Clone () as byte [] : null;
+ }
+
+ [MonoNotSupported ("This method exists but not considered.")]
+ public void SetConfigurationBytes (byte [] value)
+ {
+ 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)
+ {
+ }
}
}