2 // System.Web.Hosting.AppDomainFactory.cs
5 // Bob Smith <bob@thestuff.net>
6 // Gonzalo Paniagua (gonzalo@ximian.com)
9 // (c) Copyright 2002 Ximian, Inc. (http://www.ximian.com)
12 using System.Collections;
14 using System.Security;
15 using System.Security.Policy;
18 namespace System.Web.Hosting
20 public sealed class AppDomainFactory : IAppDomainFactory
22 static int nDomain = 0;
23 static string [] domainData = { ".appDomain",
31 public object Create (string module,
35 string strUrlOfAppOrigin,
38 appPath = Path.GetFullPath (appPath);
39 if (appPath [appPath.Length - 1] == '\\')
42 StringBuilder sb = new StringBuilder (appId);
45 sb.Append (nDomain.ToString ());
49 sb.Append ('-' + DateTime.Now.ToString ());
50 string domainId = sb.ToString ();
53 int slash = appId.IndexOf ('/');
58 vPath = appId.Substring (slash + 1);
60 string appName = (appId.GetHashCode () + appPath.GetHashCode ()).ToString ("x");
61 AppDomainSetup domainSetup = new AppDomainSetup ();
63 PopulateDomainBindings (domainId,
71 // May be adding more assemblies and such to Evidence?
72 AppDomain domain = AppDomain.CreateDomain (domainId,
73 AppDomain.CurrentDomain.Evidence,
76 string [] settings = new string [6];
79 settings [2] = appPath;
81 settings [4] = appName;
82 settings [5] = domainId;
83 for (int i = 0; i < 6; i++)
84 domain.SetData (domainData [i], settings [i]);
88 o = domain.CreateInstance (module, typeName);
90 AppDomain.Unload (domain);
97 internal static void PopulateDomainBindings (string domainId,
102 AppDomainSetup setup,
105 setup.PrivateBinPath = "bin";
106 setup.PrivateBinPathProbe = "*";
107 setup.ShadowCopyFiles = "true";
109 //HACK: we should use Uri (appBase).ToString () once Uri works fine.
110 string uri = "file://" + appPath;
111 if (Path.DirectorySeparatorChar != '/')
112 uri = uri.Replace (Path.DirectorySeparatorChar, '/');
114 setup.ApplicationBase = uri;
115 setup.ApplicationName = appName;
116 string temp = Path.GetTempPath ();
117 setup.DynamicBase = Path.Combine (temp, Environment.UserName + "-temp-aspnet");
118 string webConfigName = Path.Combine (appPath, "Web.config");
119 if (File.Exists (webConfigName))
120 setup.ConfigurationFile = webConfigName;
122 setup.ConfigurationFile = Path.Combine (appPath, "web.config");
125 dict.Add (domainData [0], "*");
126 dict.Add (domainData [1], appId);
127 dict.Add (domainData [2], appPath);
128 dict.Add (domainData [3], appVPath);
129 dict.Add (domainData [4], appName);
130 dict.Add (domainData [5], domainId);