public static AppDomain CreateDomain (string friendlyName, Evidence securityInfo, AppDomainSetup info)
{
if (friendlyName == null)
throw new System.ArgumentNullException ("friendlyName");
AppDomain def = AppDomain.DefaultDomain;
if (info == null) {
// if null, get default domain's SetupInformation
if (def == null)
info = new AppDomainSetup (); // we're default!
else
info = def.SetupInformation;
}
else
info = new AppDomainSetup (info); // copy
// todo: allow setup in the other domain
if (def != null) {
if (!info.Equals (def.SetupInformation)) {
// If not specified use default domain's app base.
if (info.ApplicationBase == null)
info.ApplicationBase = def.SetupInformation.ApplicationBase;
if (info.ConfigurationFile == null)
info.ConfigurationFile = Path.GetFileName (def.SetupInformation.ConfigurationFile);
}
} else if (info.ConfigurationFile == null)
info.ConfigurationFile = "[I don't have a config file]";
#if !NET_2_1
if (info.AppDomainInitializer != null) {
if (!info.AppDomainInitializer.Method.IsStatic)
throw new ArgumentException ("Non-static methods cannot be invoked as an appdomain initializer");
}
#endif
info.SerializeNonPrimitives ();
AppDomain ad = (AppDomain) RemotingServices.GetDomainProxy (createDomain (friendlyName, info));
if (securityInfo == null) {
// get default domain's Evidence (unless we're are the default!)
if (def == null)
ad._evidence = null; // we'll get them later (GetEntryAssembly)
else
ad._evidence = def.Evidence; // new (shallow) copy
}
else
ad._evidence = new Evidence (securityInfo); // copy
#if !NET_2_1
if (info.AppDomainInitializer != null) {
Loader loader = new Loader (
info.AppDomainInitializer.Method.DeclaringType.Assembly.Location);
ad.DoCallBack (loader.Load);
Initializer initializer = new Initializer (
info.AppDomainInitializer,
info.AppDomainInitializerArguments);
ad.DoCallBack (initializer.Initialize);
}
#endif
return ad;
}