【发布时间】:2014-10-09 13:42:45
【问题描述】:
我有一个 .net WinForms 应用程序,它将插件(dll)加载到自己的 AppDomain 中,每个 dll 使用 domain.CreateInstanceAndUnwrap() 获取自己的 AppDomain。我想要的是,这些对象永远保持连接(直到应用程序停止)。
InitialLeaseTime 是 5 分钟,但我找不到改变它的方法。 ..
我尝试覆盖远程对象的 InitializeLifetimeService():
Public Overrides Function InitializeLifetimeService() As Object
Return Nothing
End Function
这里我得到一个 Typeload-Exception,说这会破坏继承规则。 添加
<SecurityPermissionAttribute(SecurityAction.Demand, Flags:=SecurityPermissionFlag.Infrastructure)>
<SecuritySafeCritical>
不会改变任何东西。
然后:
Dim tmpObj As Object = domain.CreateInstanceAndUnwrap(type.AssemblyName, type.TypeName)
Dim tmpRemote As tmpRemoteType = CType(tmpObj, tmpRemoteType)
Dim lifetimeService As Object = Runtime.Remoting.RemotingServices.GetLifetimeService(tmpRemote)
Dim lease As ILease = TryCast(lifetimeService, ILease)
If (lease IsNot Nothing) Then
lease.Register(_sponsor)
End If
也不这样做,因为不知何故,赞助商的 Renewal() 方法(此处未显示)从未被调用。
打电话
lease.Renew(TimeSpan.FromMinutes(300))
直接更改 CurrentLeaseTime 但不更改租约的 InitialLeaseTime。
最后我尝试调用共享(静态)属性 LeaseTime,这实际上导致了在租赁开始时 CurrentLeaseTime 的变化,但再次不是 InitialLeaseTime,这似乎在 5 分钟后结束我的远程对象被 gc'ed:
LifetimeServices.RenewOnCallTime = System.TimeSpan.FromMinutes(300)
任何帮助表示赞赏, 谢谢!
【问题讨论】:
标签: c# vb.net remoting appdomain object-lifetime