summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/AppDomainManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/AppDomainManager.cs')
-rw-r--r--src/mscorlib/src/System/AppDomainManager.cs220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/AppDomainManager.cs b/src/mscorlib/src/System/AppDomainManager.cs
new file mode 100644
index 0000000000..291099e199
--- /dev/null
+++ b/src/mscorlib/src/System/AppDomainManager.cs
@@ -0,0 +1,220 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+
+//
+// An AppDomainManager gives a hosting application the chance to
+// participate in the creation and control the settings of new AppDomains.
+//
+
+namespace System {
+ using System.Collections;
+ using System.Globalization;
+ using System.IO;
+ using System.Reflection;
+ using System.Runtime.CompilerServices;
+ using System.Security;
+ using System.Security.Permissions;
+ using System.Security.Policy;
+ using System.Threading;
+#if FEATURE_CLICKONCE
+ using System.Runtime.Hosting;
+#endif
+ using System.Runtime.Versioning;
+ using System.Runtime.InteropServices;
+ using System.Diagnostics.Contracts;
+
+#if FEATURE_APPDOMAINMANAGER_INITOPTIONS
+ [Flags]
+ [System.Runtime.InteropServices.ComVisible(true)]
+ public enum AppDomainManagerInitializationOptions {
+ None = 0x0000,
+ RegisterWithHost = 0x0001
+ }
+#endif // FEATURE_APPDOMAINMANAGER_INITOPTIONS
+
+ [System.Security.SecurityCritical] // auto-generated_required
+ [System.Runtime.InteropServices.ComVisible(true)]
+#if !FEATURE_CORECLR
+ [SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.Infrastructure)]
+#endif
+#if FEATURE_REMOTING
+ public class AppDomainManager : MarshalByRefObject {
+#else // FEATURE_REMOTING
+ public class AppDomainManager {
+#endif // FEATURE_REMOTING
+ public AppDomainManager () {}
+#if FEATURE_REMOTING
+ [System.Security.SecurityCritical] // auto-generated
+ public virtual AppDomain CreateDomain (string friendlyName,
+ Evidence securityInfo,
+ AppDomainSetup appDomainInfo) {
+ return CreateDomainHelper(friendlyName, securityInfo, appDomainInfo);
+ }
+
+ [System.Security.SecurityCritical] // auto-generated_required
+ [SecurityPermissionAttribute(SecurityAction.Demand, ControlAppDomain = true)]
+ protected static AppDomain CreateDomainHelper (string friendlyName,
+ Evidence securityInfo,
+ AppDomainSetup appDomainInfo) {
+ if (friendlyName == null)
+ throw new ArgumentNullException("friendlyName", Environment.GetResourceString("ArgumentNull_String"));
+
+ Contract.EndContractBlock();
+ // If evidence is provided, we check to make sure that is allowed.
+ if (securityInfo != null) {
+ new SecurityPermission(SecurityPermissionFlag.ControlEvidence).Demand();
+
+ // Check the evidence to ensure that if it expects a sandboxed domain, it actually gets one.
+ AppDomain.CheckDomainCreationEvidence(appDomainInfo, securityInfo);
+ }
+
+ if (appDomainInfo == null) {
+ appDomainInfo = new AppDomainSetup();
+ }
+
+ // If there was no specified AppDomainManager for the new domain, default it to being the same
+ // as the current domain's AppDomainManager.
+ if (appDomainInfo.AppDomainManagerAssembly == null || appDomainInfo.AppDomainManagerType == null) {
+ string inheritedDomainManagerAssembly;
+ string inheritedDomainManagerType;
+
+ AppDomain.CurrentDomain.GetAppDomainManagerType(out inheritedDomainManagerAssembly,
+ out inheritedDomainManagerType);
+
+ if (appDomainInfo.AppDomainManagerAssembly == null) {
+ appDomainInfo.AppDomainManagerAssembly = inheritedDomainManagerAssembly;
+ }
+ if (appDomainInfo.AppDomainManagerType == null) {
+ appDomainInfo.AppDomainManagerType = inheritedDomainManagerType;
+ }
+ }
+
+ // If there was no specified TargetFrameworkName for the new domain, default it to the current domain's.
+ if (appDomainInfo.TargetFrameworkName == null)
+ appDomainInfo.TargetFrameworkName = AppDomain.CurrentDomain.GetTargetFrameworkName();
+
+ return AppDomain.nCreateDomain(friendlyName,
+ appDomainInfo,
+ securityInfo,
+ securityInfo == null ? AppDomain.CurrentDomain.InternalEvidence : null,
+ AppDomain.CurrentDomain.GetSecurityDescriptor());
+ }
+#endif // FEATURE_REMOTING
+
+ [System.Security.SecurityCritical]
+ public virtual void InitializeNewDomain (AppDomainSetup appDomainInfo) {
+ // By default, InitializeNewDomain does nothing. AppDomain.CreateAppDomainManager relies on this fact.
+ }
+
+#if FEATURE_APPDOMAINMANAGER_INITOPTIONS
+
+ private AppDomainManagerInitializationOptions m_flags = AppDomainManagerInitializationOptions.None;
+ public AppDomainManagerInitializationOptions InitializationFlags {
+ get {
+ return m_flags;
+ }
+ set {
+ m_flags = value;
+ }
+ }
+#endif // FEATURE_APPDOMAINMANAGER_INITOPTIONS
+
+#if FEATURE_CLICKONCE
+ private ApplicationActivator m_appActivator = null;
+ public virtual ApplicationActivator ApplicationActivator {
+ get {
+ if (m_appActivator == null)
+ m_appActivator = new ApplicationActivator();
+ return m_appActivator;
+ }
+ }
+#endif //#if FEATURE_CLICKONCE
+
+#if FEATURE_CAS_POLICY
+ public virtual HostSecurityManager HostSecurityManager {
+ get {
+ return null;
+ }
+ }
+
+ public virtual HostExecutionContextManager HostExecutionContextManager {
+ get {
+ // By default, the AppDomainManager returns the HostExecutionContextManager.
+ return HostExecutionContextManager.GetInternalHostExecutionContextManager();
+ }
+ }
+#endif // FEATURE_CAS_POLICY
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode), SuppressUnmanagedCodeSecurity]
+ private static extern void GetEntryAssembly(ObjectHandleOnStack retAssembly);
+
+ private Assembly m_entryAssembly = null;
+ public virtual Assembly EntryAssembly {
+ [System.Security.SecurityCritical] // auto-generated
+ get {
+ // The default AppDomainManager sets the EntryAssembly depending on whether the
+ // AppDomain is a manifest application domain or not. In the first case, we parse
+ // the application manifest to find out the entry point assembly and return that assembly.
+ // In the second case, we maintain the old behavior by calling GetEntryAssembly().
+ if (m_entryAssembly == null)
+ {
+
+#if FEATURE_CLICKONCE
+ AppDomain domain = AppDomain.CurrentDomain;
+ if (domain.IsDefaultAppDomain() && domain.ActivationContext != null) {
+ ManifestRunner runner = new ManifestRunner(domain, domain.ActivationContext);
+ m_entryAssembly = runner.EntryAssembly;
+ } else
+#endif //#if FEATURE_CLICKONCE
+ {
+ RuntimeAssembly entryAssembly = null;
+ GetEntryAssembly(JitHelpers.GetObjectHandleOnStack(ref entryAssembly));
+ m_entryAssembly = entryAssembly;
+ }
+ }
+ return m_entryAssembly;
+ }
+ }
+
+ internal static AppDomainManager CurrentAppDomainManager {
+ [System.Security.SecurityCritical] // auto-generated
+ get {
+ return AppDomain.CurrentDomain.DomainManager;
+ }
+ }
+
+ public virtual bool CheckSecuritySettings (SecurityState state)
+ {
+ return false;
+ }
+
+#if FEATURE_APPDOMAINMANAGER_INITOPTIONS
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private static extern bool HasHost();
+
+ [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+ [SecurityCritical]
+ [SuppressUnmanagedCodeSecurity]
+ private static extern void RegisterWithHost(IntPtr appDomainManager);
+
+ internal void RegisterWithHost() {
+ if (HasHost()) {
+ IntPtr punkAppDomainManager = IntPtr.Zero;
+
+ RuntimeHelpers.PrepareConstrainedRegions();
+ try {
+ punkAppDomainManager = Marshal.GetIUnknownForObject(this);
+ RegisterWithHost(punkAppDomainManager);
+ }
+ finally {
+ if (!punkAppDomainManager.IsNull()) {
+ Marshal.Release(punkAppDomainManager);
+ }
+ }
+ }
+ }
+#endif // FEATURE_APPDOMAINMANAGER_INITOPTIONS
+ }
+}