6 // Paolo Molaro (lupus@ximian.com)
7 // Dietmar Maurer (dietmar@ximian.com)
9 // (C) 2001 Ximian, Inc. http://www.ximian.com
13 using System.Collections;
14 using System.Reflection;
15 using System.Reflection.Emit;
16 using System.Runtime.CompilerServices;
17 using System.Security.Policy;
21 public sealed class AppDomain /* : MarshalByRefObject , _AppDomain, IEvidenceFactory */ {
23 private Hashtable loaded_assemblies = new Hashtable ();
25 private Hashtable data_hash = new Hashtable ();
27 private AppDomainSetup adsetup;
29 private string friendly_name;
31 private Evidence evidence;
33 public AppDomainSetup SetupInformation {
40 public string BaseDirectory {
43 return adsetup.ApplicationBase;
47 public string RelativeSearchPath {
50 return adsetup.PrivateBinPath;
54 public string DynamicDirectory {
57 // fixme: dont know what to return here
62 public string FriendlyName {
69 public Evidence Evidence {
77 public static AppDomain CreateDomain(string friendlyName)
79 return CreateDomain (friendlyName, new Evidence (), new AppDomainSetup ());
82 public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo)
84 return CreateDomain (friendlyName, securityInfo, new AppDomainSetup ());
87 public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup info)
89 if (friendlyName == null || securityInfo == null || info == null)
90 throw new System.ArgumentNullException();
92 AppDomain ad = new AppDomain ();
94 ad.friendly_name = friendlyName;
95 ad.evidence = securityInfo;
101 public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo, string appBasePath,
102 string appRelativeSearchPath, bool shadowCopyFiles)
104 AppDomainSetup info = new AppDomainSetup ();
106 info.ApplicationBase = appBasePath;
107 info.PrivateBinPath = appRelativeSearchPath;
110 info.ShadowCopyFiles = "true";
112 info.ShadowCopyFiles = "false";
114 return CreateDomain (friendlyName, securityInfo, info);
117 [MethodImplAttribute(MethodImplOptions.InternalCall)]
118 public static extern Assembly LoadFrom(String assemblyFile, Evidence securityEvidence);
120 [MethodImplAttribute(MethodImplOptions.InternalCall)]
121 private static extern AppDomain getCurDomain ();
123 public static AppDomain CurrentDomain
126 return getCurDomain ();
130 public AssemblyBuilder DefineDynamicAssembly (AssemblyName name,
131 AssemblyBuilderAccess access)
133 AssemblyBuilder ab = new AssemblyBuilder (name, access);
137 public Assembly Load (AssemblyName assemblyRef)
139 return Load (assemblyRef, new Evidence ());
142 public Assembly Load (AssemblyName assemblyRef, Evidence assemblySecurity)
146 if ((res = (Assembly)loaded_assemblies [assemblyRef]) != null)
149 // fixme: we should pass the whole assemblyRef instead of the name,
150 // and maybe also the adsetup
151 res = LoadFrom (assemblyRef.Name, assemblySecurity);
153 loaded_assemblies [assemblyRef] = res;
158 public Assembly Load (string assemblyString)
160 AssemblyName an = new AssemblyName ();
161 an.Name = assemblyString;
163 return Load (an, new Evidence ());
166 public Assembly Load (string assemblyString, Evidence assemblySecurity)
168 AssemblyName an = new AssemblyName ();
169 an.Name = assemblyString;
171 return Load (an, assemblySecurity);
174 public Assembly Load (byte[] rawAssembly)
176 return Load (rawAssembly, null, new Evidence ());
179 public Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore)
181 return Load (rawAssembly, rawSymbolStore, new Evidence ());
184 public Assembly Load (byte[] rawAssembly, byte[] rawSymbolStore, Evidence securityEvidence)
186 throw new NotImplementedException ();
189 public Assembly[] GetAssemblies ()
191 int x = loaded_assemblies.Count;
193 Assembly[] res = new Assembly [loaded_assemblies.Count];
195 IDictionaryEnumerator it = loaded_assemblies.GetEnumerator ();
199 while (it.MoveNext ())
200 res [i++] = (Assembly)it.Value;
205 // fixme: how does marshalling work ?
206 public object GetData (string name)
209 case "APPBASE": return adsetup.ApplicationBase;
210 case "APP_CONFIG_FILE": return adsetup.ConfigurationFile;
211 case "DYNAMIC_BASE": return adsetup.DynamicBase;
212 case "APP_NAME": return adsetup.ApplicationName;
213 case "CACHE_BASE": return adsetup.CachePath;
214 case "PRIVATE_BINPATH": return adsetup.PrivateBinPath;
215 case "BINPATH_PROBE_ONLY": return adsetup.PrivateBinPathProbe;
216 case "SHADOW_COPY_DIRS": return adsetup.ShadowCopyDirectories;
217 case "FORCE_CACHE_INSTALL": return adsetup.ShadowCopyFiles;
220 return data_hash [name];
223 // fixme: how does marshalling work ?
224 public void SetData (string name, object data)
226 // LAMESPEC: why can't we set adsetup properties ??
228 data_hash [name] = data;