using System; public delegate void UnmanagedEventHandler (IntPtr target, IntPtr calldata, IntPtr closure); [Serializable] public class CrossDomainProxy { public CrossDomainProxy (AppDomain domain, UnmanagedEventHandler handler) { Console.WriteLine ("Created proxy in domain {0}", domain.FriendlyName); this.domain = domain; this.handler = handler; _wrapper = new UnmanagedEventHandler (wrapper); } public UnmanagedEventHandler Wrapper { get { return _wrapper; } } public void wrapper (IntPtr target, IntPtr calldata, IntPtr closure) { Console.WriteLine ("wrapper called in domain {0}", AppDomain.CurrentDomain.FriendlyName); Console.WriteLine (" + domain = {0}", domain.FriendlyName); this.target = target; this.calldata = calldata; this.closure = closure; domain.DoCallBack (new CrossAppDomainDelegate (call_in_target_domain)); } public void call_in_target_domain () { Console.WriteLine ("call_in_target_domain called in domain {0}", AppDomain.CurrentDomain.FriendlyName); handler (target, calldata, closure); } public AppDomain domain; public UnmanagedEventHandler handler; public UnmanagedEventHandler _wrapper; public IntPtr target; public IntPtr calldata; public IntPtr closure; public static void Main (string[] args) { AppDomain cd = AppDomain.CreateDomain ("my app domain"); CrossDomainProxy proxy = new CrossDomainProxy (cd, new UnmanagedEventHandler (Foo)); proxy.Wrapper (IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); } public static void Foo (IntPtr targe, IntPtr calldata, IntPtr closure) { Console.WriteLine ("hi from Foo on AppDomain {0}", AppDomain.CurrentDomain.FriendlyName); } }