AppDomain. , Foo.:
public static class Foo {
public static event EventHandler<EventArgs> Bar;
public static string Message;
public static void RunBar() {
var bar = Bar;
if (bar != null) {
bar.Invoke(null, EventArgs.Empty);
}
}
}
, , :
public interface IFooWrapper {
event EventHandler<EventArgs> Bar;
string Message { get; set; }
void RunBar();
}
, / Foo.
public class FooWrapper : MarshalByRefObject, IFooWrapper {
public string Message {
get { return Foo.Message; }
set { Foo.Message = value; }
}
public event EventHandler<EventArgs> Bar;
public FooWrapper() {
Foo.Bar += (sender, args) => {
var myBar = Bar;
if (myBar != null) {
myBar(sender, args);
}
};
}
public void RunBar() {
Foo.RunBar();
}
}
, - FooWrapper , IFooWrapper
var domain1 = AppDomain.CreateDomain("Foo1");
var domain2 = AppDomain.CreateDomain("Foo2");
var foo1 = (IFooWrapper)domain1.CreateInstanceAndUnwrap("ConsoleApplication2", "ConsoleApplication2.FooWrapper");
foo1.Message = "Foo1";
foo1.Bar += (sender, eargs) => {
Console.Out.WriteLine("foo1 bar called");
};
var foo2 = (IFooWrapper)domain2.CreateInstanceAndUnwrap("ConsoleApplication2", "ConsoleApplication2.FooWrapper");
foo2.Message = "Foo2";
foo2.Bar += (sender, eargs) => {
Console.Out.WriteLine("foo2 bar called");
};
:
Console.Out.WriteLine(foo1.Message);
Console.Out.WriteLine(foo2.Message);
foo1.RunBar();
foo2.RunBar();
Foo.RunBar();
source
share