Beispiel #1
0
        BareApplicationHost CreateHost(string appId, string vpath, string ppath)
        {
            BareApplicationHost host;

            host = (BareApplicationHost)ApplicationHost.CreateApplicationHost(typeof(BareApplicationHost), vpath, ppath);
            HostingEnvironment.SetIsHosted(true);
            host.Manager       = this;
            host.AppID         = appId;
            id_to_host [appId] = host;
            return(host);
        }
Beispiel #2
0
        public static object CreateApplicationHost(Type hostType, string virtualDir, string physicalDir)
        {
            if (physicalDir == null)
            {
                throw new NullReferenceException();
            }

            // Make sure physicalDir has file system semantics
            // and not uri semantics ( '\' and not '/' ).
            physicalDir = Path.GetFullPath(physicalDir);

            if (hostType == null)
            {
                throw new ArgumentException("hostType can't be null");
            }

            if (virtualDir == null)
            {
                throw new ArgumentNullException("virtualDir");
            }

            Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);

            //
            // Setup
            //
            AppDomainSetup setup = new AppDomainSetup();

            setup.ApplicationBase = physicalDir;

            setup.ConfigurationFile    = FindWebConfig(physicalDir);
            setup.DisallowCodeDownload = true;

            string[] bindirPath = new string [1] {
#if NET_2_0
                Path.Combine(physicalDir, "bin")
#else
                "bin"
#endif
            };
            string bindir;

            foreach (string dir in HttpApplication.BinDirs)
            {
                bindir = Path.Combine(physicalDir, dir);

                if (Directory.Exists(bindir))
                {
#if NET_2_0
                    bindirPath [0] = bindir;
#else
                    bindirPath [0] = dir;
#endif
                    break;
                }
            }

            setup.PrivateBinPath      = BuildPrivateBinPath(physicalDir, bindirPath);
            setup.PrivateBinPathProbe = "*";
#if !NET_2_0
            setup.ShadowCopyFiles       = "true";
            setup.ShadowCopyDirectories = setup.PrivateBinPath;
#endif
            string dynamic_dir = null;
            string user        = Environment.UserName;
            int    tempDirTag  = 0;
            string dirPrefix   = String.Concat(user, "-temp-aspnet-");

            for (int i = 0; ; i++)
            {
                string d = Path.Combine(Path.GetTempPath(), String.Concat(dirPrefix, i.ToString("x")));

                try {
                    CreateDirectory(d);
                    string stamp = Path.Combine(d, "stamp");
                    CreateDirectory(stamp);
                    dynamic_dir = d;
                    try {
                        Directory.Delete(stamp);
                    } catch (Exception) {
                        // ignore
                    }

                    tempDirTag = i.GetHashCode();
                    break;
                } catch (UnauthorizedAccessException) {
                    continue;
                }
            }
            //
            // Unique Domain ID
            //
            string domain_id = (virtualDir.GetHashCode() + 1 ^ physicalDir.GetHashCode() + 2 ^ tempDirTag).ToString("x");

            // This is used by mod_mono's fail-over support
            string domain_id_suffix = Environment.GetEnvironmentVariable("__MONO_DOMAIN_ID_SUFFIX");
            if (domain_id_suffix != null && domain_id_suffix.Length > 0)
            {
                domain_id += domain_id_suffix;
            }

            setup.ApplicationName = domain_id;
            setup.DynamicBase     = dynamic_dir;
            setup.CachePath       = dynamic_dir;

            string dynamic_base = setup.DynamicBase;
            if (CreateDirectory(dynamic_base) && (Environment.GetEnvironmentVariable("MONO_ASPNET_NODELETE") == null))
            {
                ClearDynamicBaseDirectory(dynamic_base);
            }

            //
            // Create app domain
            //
            AppDomain appdomain;
            appdomain = AppDomain.CreateDomain(domain_id, evidence, setup);

            //
            // Populate with the AppDomain data keys expected, Mono only uses a
            // few, but third party apps might use others:
            //
            appdomain.SetData(".appDomain", "*");
            int l = physicalDir.Length;
            if (physicalDir [l - 1] != Path.DirectorySeparatorChar)
            {
                physicalDir += Path.DirectorySeparatorChar;
            }
            appdomain.SetData(".appPath", physicalDir);
            appdomain.SetData(".appVPath", virtualDir);
            appdomain.SetData(".domainId", domain_id);
            appdomain.SetData(".hostingVirtualPath", virtualDir);
            appdomain.SetData(".hostingInstallDir", Path.GetDirectoryName(typeof(Object).Assembly.CodeBase));
#if NET_2_0
            appdomain.SetData("DataDirectory", Path.Combine(physicalDir, "App_Data"));
            HostingEnvironment.SetIsHosted(false);
#endif
            appdomain.SetData(MonoHostedDataKey, "yes");

#if NET_2_0
            appdomain.DoCallBack(SetHostingEnvironment);
#endif
            return(appdomain.CreateInstanceAndUnwrap(hostType.Module.Assembly.FullName, hostType.FullName));
        }