我們有一個插件系統,其中插件代碼在主進程的獨立AppDomain上運行,使用.NET Remoting進行通信。.NET Remoting和HttpContext.Current
一類是類似於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駐留在主應用程序域(與即時窗口驗證),所有的靜態數據,如MyClass.Instance和HttpContext.Current已經消失,並且爲空。我有一種感覺,MyClass.Instance以某種方式從插件AppDomain中檢索,但我不確定如何解決此問題。
我看到另一個問題,建議RemotingServices.Marshal
,但這似乎沒有幫助,或者我用它不正確。有沒有一種方法可以使CommunicatingClass像AppDomain中的其他類一樣訪問所有靜態方法和屬性?
編輯:
的插件類的給定一個實例是這樣的:
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時,從PluginClass的AppDomain中檢索(如果這是有道理的)。
如果你不知道:遠程處理,取而代之WCF的被棄用。 – 2011-02-01 02:40:26
如果您包含用於在PluginClass應用程序域中獲取對communicationsClass的引用的代碼,它可能會有所幫助。 – JohnOpincar 2011-02-01 02:41:30
@John Saunders,WCF如何與跨應用程序域通信一起工作?當客戶端和服務器分開時,它是有意義的,但在這種情況下,它看起來不像透明的遠程代理那麼簡單。我從來沒有使用WCF,只是看着它。 – Snea 2011-02-01 03:33:54