rendered paste bodyusing 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);
}
}