// This routine is called from unmanaged code to // set the default fusion context. private void SetupDomain(bool allowRedirects, String path, String configFile, String[] propertyNames, String[] propertyValues) { // It is possible that we could have multiple threads initializing // the default domain. We will just take the winner of these two. // (eg. one thread doing a com call and another doing attach for IJW) lock (this) { if (_FusionStore == null) { AppDomainSetup setup = new AppDomainSetup(); // always use internet permission set setup.InternalSetApplicationTrust("Internet"); SetupFusionStore(setup, null); } } }
[System.Security.SecurityCritical] // auto-generated private void SetupDomain(bool allowRedirects, String path, String configFile, String[] propertyNames, String[] propertyValues) { // It is possible that we could have multiple threads initializing // the default domain. We will just take the winner of these two. // (eg. one thread doing a com call and another doing attach for IJW) lock (this) { if(_FusionStore == null) { AppDomainSetup setup = new AppDomainSetup(); #if FEATURE_CORECLR // always use internet permission set setup.InternalSetApplicationTrust("Internet"); #endif // FEATURE_CORECLR #if FEATURE_FUSION setup.SetupDefaults(RuntimeEnvironment.GetModuleFileName(), imageLocationAlreadyNormalized : true); if(path != null) setup.Value[(int) AppDomainSetup.LoaderInformation.ApplicationBaseValue] = path; if(configFile != null) setup.Value[(int) AppDomainSetup.LoaderInformation.ConfigurationFileValue] = configFile; // Default fusion context starts with binding redirects turned off. if (!allowRedirects) setup.DisallowBindingRedirects = true; #endif #if !FEATURE_CORECLR if (propertyNames != null) { BCLDebug.Assert(propertyValues != null, "propertyValues != null"); BCLDebug.Assert(propertyNames.Length == propertyValues.Length, "propertyNames.Length == propertyValues.Length"); for (int i = 0; i < propertyNames.Length; ++i) { if (String.Equals(propertyNames[i], "PARTIAL_TRUST_VISIBLE_ASSEMBLIES", StringComparison.Ordinal)) { // The value of the PARTIAL_TRUST_VISIBLE_ASSEMBLIES property is a semicolon // delimited list of assembly names to add to the // PartialTrustVisibleAssemblies setting of the domain setup if (propertyValues[i] != null) { if (propertyValues[i].Length > 0) { setup.PartialTrustVisibleAssemblies = propertyValues[i].Split(';'); } else { setup.PartialTrustVisibleAssemblies = new string[0]; } } } else { // In v4 we disallow anything but PARTIAL_TRUST_VISIBLE_ASSEMBLIES to come // in via the default domain properties. That restriction could be lifted // in a future release, at which point this assert should be removed. // // This should be kept in sync with the real externally facing filter code // in CorHost2::SetPropertiesForDefaultAppDomain BCLDebug.Assert(false, "Unexpected default domain property"); } } } #endif // !FEATURE_CORECLR #if FEATURE_APTCA // Propigate the set of conditional APTCA assemblies that will be used in the default // domain onto the domain itself and also into the VM PartialTrustVisibleAssemblies = setup.PartialTrustVisibleAssemblies; #endif // FEATURE_APTCA SetupFusionStore(setup, null); } } }
} // PrepareDataForSetup private static Object Setup(Object arg) { Contract.Requires(arg != null && arg is Object[]); Contract.Requires(((Object[])arg).Length >= 8); Object[] args = (Object[])arg; String friendlyName = (String)args[0]; AppDomainSetup setup = (AppDomainSetup)args[1]; IntPtr parentSecurityDescriptor = (IntPtr)args[2]; bool generateDefaultEvidence = (bool)args[3]; byte[] serializedEvidence = (byte[])args[4]; AppDomainInitializerInfo initializerInfo = (AppDomainInitializerInfo)args[5]; string sandboxName = (string)args[6]; string[] propertyNames = (string[])args[7]; // can contain null elements string[] propertyValues = (string[])args[8]; // can contain null elements // extract evidence Evidence providedSecurityInfo = null; Evidence creatorsSecurityInfo = null; AppDomain ad = AppDomain.CurrentDomain; AppDomainSetup newSetup = new AppDomainSetup(setup, false); if (propertyNames != null && propertyValues != null) { for (int i = 0; i < propertyNames.Length; i++) { // We want to set native dll probing directories before any P/Invokes have a // chance to fire. The Path class, for one, has P/Invokes. if (propertyNames[i] == "NATIVE_DLL_SEARCH_DIRECTORIES") { if (propertyValues[i] == null) { throw new ArgumentNullException("NATIVE_DLL_SEARCH_DIRECTORIES"); } string paths = propertyValues[i]; if (paths.Length == 0) { break; } nSetNativeDllSearchDirectories(paths); } } for (int i = 0; i < propertyNames.Length; i++) { if (propertyNames[i] == "APPBASE") // make sure in sync with Fusion { if (propertyValues[i] == null) { throw new ArgumentNullException("APPBASE"); } if (PathInternal.IsPartiallyQualified(propertyValues[i])) { throw new ArgumentException(SR.Argument_AbsolutePathRequired); } newSetup.ApplicationBase = NormalizePath(propertyValues[i], fullCheck: true); } else if (propertyNames[i] == "LOADER_OPTIMIZATION") { if (propertyValues[i] == null) { throw new ArgumentNullException("LOADER_OPTIMIZATION"); } switch (propertyValues[i]) { case "SingleDomain": newSetup.LoaderOptimization = LoaderOptimization.SingleDomain; break; case "MultiDomain": newSetup.LoaderOptimization = LoaderOptimization.MultiDomain; break; case "MultiDomainHost": newSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost; break; case "NotSpecified": newSetup.LoaderOptimization = LoaderOptimization.NotSpecified; break; default: throw new ArgumentException(SR.Argument_UnrecognizedLoaderOptimization, "LOADER_OPTIMIZATION"); } } else if (propertyNames[i] == "TRUSTED_PLATFORM_ASSEMBLIES" || propertyNames[i] == "PLATFORM_RESOURCE_ROOTS" || propertyNames[i] == "APP_PATHS" || propertyNames[i] == "APP_NI_PATHS") { string values = propertyValues[i]; if (values == null) { throw new ArgumentNullException(propertyNames[i]); } ad.SetData(propertyNames[i], NormalizeAppPaths(values)); } else if (propertyNames[i] != null) { ad.SetData(propertyNames[i], propertyValues[i]); // just propagate } } } ad.SetupFusionStore(newSetup, null); // makes FusionStore a ref to newSetup // technically, we don't need this, newSetup refers to the same object as FusionStore // but it's confusing since it isn't immediately obvious whether we have a ref or a copy AppDomainSetup adSetup = ad.FusionStore; adSetup.InternalSetApplicationTrust(sandboxName); // set up the friendly name ad.nSetupFriendlyName(friendlyName); #if FEATURE_COMINTEROP if (setup != null && setup.SandboxInterop) { ad.nSetDisableInterfaceCache(); } #endif // FEATURE_COMINTEROP ad.CreateAppDomainManager(); // could modify FusionStore's object ad.InitializeDomainSecurity(providedSecurityInfo, creatorsSecurityInfo, generateDefaultEvidence, parentSecurityDescriptor, true); // can load user code now if (initializerInfo != null) { adSetup.AppDomainInitializer = initializerInfo.Unwrap(); } RunInitializer(adSetup); return(null); }
// This routine is called from unmanaged code to // set the default fusion context. private void SetupDomain(bool allowRedirects, String path, String configFile, String[] propertyNames, String[] propertyValues) { // It is possible that we could have multiple threads initializing // the default domain. We will just take the winner of these two. // (eg. one thread doing a com call and another doing attach for IJW) lock (this) { if(_FusionStore == null) { AppDomainSetup setup = new AppDomainSetup(); // always use internet permission set setup.InternalSetApplicationTrust("Internet"); SetupFusionStore(setup, null); } } }