Csharp/C Sharp/Development Class/AppDomain
Содержание
- 1 AppDomain.CreateDomain
- 2 Configure the AppDomainSetup
- 3 creates three instances of the same type. A local and two remote proxies to object instances are constructed:
- 4 FriendlyName
- 5 OnUnhandledException method is added to the AppDomain.UnhandledException event
- 6 SetData, GetData
- 7 SetPrincipalPolicy
AppDomain.CreateDomain
<source lang="csharp">
using System;
class MainClass { public static void Main() { AppDomainSetup setupInfo = new AppDomainSetup(); setupInfo.ApplicationBase = @"C:\MyRootDirectory"; setupInfo.ConfigurationFile = "MyApp.config"; setupInfo.PrivateBinPath = "bin;plugins;external"; AppDomain newDomain = AppDomain.CreateDomain("My New AppDomain", null, setupInfo); } } </source>
Configure the AppDomainSetup
<source lang="csharp"> using System; class Test {
public static void Main() { AppDomainSetup setupInfo = new AppDomainSetup(); setupInfo.ApplicationBase = @"C:\MyRootDirectory"; setupInfo.ConfigurationFile = "MyApp.config"; setupInfo.PrivateBinPath = "bin;plugins;external"; AppDomain newDomain = AppDomain.CreateDomain("My New AppDomain", null, setupInfo); }
}
</source>
creates three instances of the same type. A local and two remote proxies to object instances are constructed:
<source lang="csharp"> using System; using System.Reflection; using System.Runtime.Remoting;
class MyClass {
public void MethodA(DateTime dt) { Console.WriteLine("MethodA invoked at " + dt.ToLongTimeString()); }
} class Starter {
static void Main() { CreateLocal(); CreateRemote1(); CreateRemote2(); } static void CreateLocal() { object obj = Activator.CreateInstance(typeof(MyClass)); ((MyClass)obj).MethodA(DateTime.Now); } static void CreateRemote1() { ObjectHandle hObj = Activator.CreateInstance("library","MyClass"); object obj = hObj.Unwrap(); MethodInfo method = obj.GetType().GetMethod("MethodA"); method.Invoke(obj, new object[1] { DateTime.Now }); } static void CreateRemote2() { AppDomain domain = AppDomain.CurrentDomain; object obj = domain.CreateInstanceFromAndUnwrap("library.dll","MyClass"); MethodInfo method = obj.GetType().GetMethod("MethodA"); method.Invoke(obj, new object[1] { DateTime.Now }); }
}
</source>
FriendlyName
<source lang="csharp"> using System; using System.Collections.Generic; using System.Text; class Program {
static void Main(string[] args) { AppDomain currentDomain = AppDomain.CurrentDomain; Console.WriteLine(currentDomain.FriendlyName); AppDomain secondDomain = AppDomain.CreateDomain("New AppDomain"); secondDomain.CreateInstance("AssemblyA", "AppDomains.Demo", true,System.Reflection.BindingFlags.CreateInstance, null, new object[] { 7, 3 }, null, null, null); }
}
</source>
OnUnhandledException method is added to the AppDomain.UnhandledException event
<source lang="csharp"> using System; public class Starter {
public static void Main() { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); int vara = 5, varb = 0; vara /= varb; } public static void OnUnhandledException( object sender, UnhandledExceptionEventArgs e) { string application_name = sender.ToString(); Exception except = (Exception)e.ExceptionObject; string errormessage = "Application " + application_name + " [ Exception " + except.Message + " ]"; Console.WriteLine(errormessage); }
}
</source>
SetData, GetData
<source lang="csharp"> using System; using System.Reflection; using System.Collections; class ListModifier{
public ListModifier() { ArrayList list = (ArrayList)AppDomain.CurrentDomain.GetData("Pets"); list.Add("turtle"); }
} class MainClass{
public static void Main(){ AppDomain domain = AppDomain.CreateDomain("Test"); ArrayList list = new ArrayList(); list.Add("dog"); list.Add("cat"); list.Add("fish"); domain.SetData("Pets", list); domain.CreateInstance("MainClass","Apress.VisualCSharpRecipes.Chapter03.ListModifier"); foreach (string s in (ArrayList)domain.GetData("Pets")) { Console.WriteLine(s); } }
}
</source>
SetPrincipalPolicy
<source lang="csharp"> using System; using System.Security; using System.Security.Principal; using System.Security.Permissions; class Program {
static void Main(string[] args) { AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); try { ShowMessage(); } catch (SecurityException exception) { Console.WriteLine(exception.Message); } } [PrincipalPermissionAttribute(SecurityAction.Demand,Role = "BUILTIN\\Users")] static void ShowMessage() { Console.WriteLine("The current principal is logged in locally "); Console.WriteLine("(they are a member of the local Users group)"); }
}
</source>