У нас есть система подключаемых модулей, в которой код подключаемого модуля выполняется в отдельном домене приложений от основного процесса, используя удаленное взаимодействие .NET для взаимодействия объектов.
Один класс - это похож на HttpContext.Current (который также страдает от проблемы) (отредактируйте, фактическая реализация):
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;
}
}
}
Затем у нас есть объект связи, который наследуется от MarshalByRefObject:
public class CommunicatingClass : MarshalByRefObject, ICommunicatingClass
{
public void DoSomething()
{
MyClass.Instance.DoSomething();
}
}
Класс CommunicatingClass создается в основном домене приложения и работает Хорошо. Затем есть класс подключаемого модуля, который создается в его AppDomain и получает экземпляр класса CommunicatingClass:
public class PluginClass
{
public void DoSomething(ICommunicatingClass communicatingClass)
{
communicatingClass.DoSomething();
}
}
Проблема в том, что хотя CommunicatingClass находится в основном домене приложения (проверяется с помощью Immediate Window), все статические данные, такие как MyClass.Instance и HttpContext.Current, исчезли и имеют значение null. У меня есть ощущение, что MyClass.Instance каким-то образом извлекается из подключаемого домена AppDomain, но я не уверен, как это решить.
Я видел другой вопрос, предлагавший RemotingServices.Marshal
, но это не похоже help, или я неправильно воспользовался. Есть ли способ, которым CommunicatingClass может получить доступ ко всем статическим методам и свойствам, как и любой другой класс в основном домене приложения?
Изменить:
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? Мне все еще интересно, почему, несмотря на то, что он запущен в AppDomain HttpContext.Current, CommunicatingClass.DoSomething при вызове MyClass.Instance извлекает данные из AppDomain PluginClass (если это имеет смысл).