We have a plug-in system in which the plug-in code runs on a separate AppDomain from the main process, using remote .NET for objects to communicate.
One class is similar to HttpContext.Current (which also suffers from a problem) (editing, actual implementation):
public class MyClass
{
public static MyClass Instance
{
get
{
if(HttpContext.Current != null)
return HttpContext.Current.Items["MyClassInstance"];
}
set
{
if(HttpContext.Current != null)
HttpContext.Current.Items["MyClassInstance"] = value;
}
}
}
Then we have a communication object that inherits from MarshalByRefObject:
public class CommunicatingClass : MarshalByRefObject, ICommunicatingClass
{
public void DoSomething()
{
MyClass.Instance.DoSomething();
}
}
CommunicatingClass is created on the main AppDomain and works fine. Then there is a plugin class that is created on its AppDomain, and a CommunicatingClass instance is set:
public class PluginClass
{
public void DoSomething(ICommunicatingClass communicatingClass)
{
communicatingClass.DoSomething();
}
}
, , CommunicatingClass appdomain ( Immediate), , MyClass.Instance HttpContext.Current, null. , MyClass.Instance - AppDomain, , .
, RemotingServices.Marshal, , , , . , CommunicatingClass , AppDomain?
Edit:
PluginClass :
public static PluginClass Create()
{
var appDomain = GetNewAppDomain();
var instance = (PluginClass)appDomain.CreateInstanceAndUnwrap(assembly, type);
instance.Communicator = new CommunicatingClass();
return instance;
}
2:
, . MyClass.Instance HttpContext.Current.Items(. ).
, HttpContext.Current HttpContext? , , HttpContext.Current AppDomain, CommunicatingClass.DoSomething, MyClass.Instance AppDomain PluginClass ( ).