// 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;
-#endif
+using System.Security.Policy;
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
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 NET_2_0
+
+#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;
}
-#if NET_2_0
public AppDomainSetup (ActivationArguments activationArguments)
{
_activationArguments = activationArguments;
{
_activationArguments = new ActivationArguments (activationContext);
}
-#endif
static string GetAppBase (string appBase)
{
// 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);
}
return appBase;
}
-
+
public string ApplicationBase {
get { return GetAppBase (application_base); }
set { application_base = value; }
}
}
- [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
}
}
}
}
-#if NET_1_1
public bool DisallowBindingRedirects {
get {
return disallow_binding_redirects;
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 {
+ 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)
+ {
+ }
}
}