I have the following code:
public class AppDomainArgs : MarshalByRefObject {
public string myString;
}
static AppDomainArgs ada = new AppDomainArgs() { myString = "abc" };
static void Main(string[] args) {
AppDomain domain = AppDomain.CreateDomain("Domain666");
domain.DoCallBack(MyNewAppDomainMethod);
Console.WriteLine(ada.myString);
Console.ReadKey();
AppDomain.Unload(domain);
}
static void MyNewAppDomainMethod() {
ada.myString = "working!";
}
I thought make this would make my ada.myString have "working!" on the main appdomain, but it doesn't. I thought that by inhering from MarshalByRefObject any changes made on the 2nd appdomain would reflect also in the original one(I thought this would be just a proxy to the real object on the main appdomain!)?
Thanks
The problem in your code is that you never actually pass the object over the boundary; thus you have two ada
instances, one in each app-domain (the static field initializer runs on both app-domains). You will need to pass the instance over the boundary for the MarshalByRefObject
magic to kick in.
For example:
using System;
class MyBoundaryObject : MarshalByRefObject {
public void SomeMethod(AppDomainArgs ada) {
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing");
ada.myString = "working!";
}
}
public class AppDomainArgs : MarshalByRefObject {
public string myString { get; set; }
}
static class Program {
static void Main() {
AppDomain domain = AppDomain.CreateDomain("Domain666");
MyBoundaryObject boundary = (MyBoundaryObject)
domain.CreateInstanceAndUnwrap(
typeof(MyBoundaryObject).Assembly.FullName,
typeof(MyBoundaryObject).FullName);
AppDomainArgs ada = new AppDomainArgs();
ada.myString = "abc";
Console.WriteLine("Before: " + ada.myString);
boundary.SomeMethod(ada);
Console.WriteLine("After: " + ada.myString);
Console.ReadKey();
AppDomain.Unload(domain);
}
}