У меня есть приложение .net WinForms, которое загружает плагины (dll) в свои собственные AppDomains, каждая dll получает свой собственный AppDomain, используя domain.CreateInstanceAndUnwrap(). Все, что я хочу, это то, что эти объекты остаются связанными навсегда (до тех пор, пока приложение не остановится).
InitialLeaseTime - 5 минут, но я не могу найти способ изменить это. .. я пытался перекрывая InitializeLifetimeService() удаленного объекта:MarshalByRefObject Lifetime
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
не сделает это ни, потому что как-то метод обновления() спонсора (не показан здесь) никогда не вызывается.
Вызов
lease.Renew(TimeSpan.FromMinutes(300))
непосредственно изменяет CurrentLeaseTime но не InitialLeaseTime в аренду.
Наконец я попытался вызова общий (статический) свойство LeaseTime, которое фактически привело к изменению CurrentLeaseTime в начале аренды, но опять-таки НЕ InitialLeaseTime, который, кажется, заканчивается через 5 минут и мой удаленный объект будучи gc'ed:
LifetimeServices.RenewOnCallTime = System.TimeSpan.FromMinutes(300)
Любая помощь приветствуется, Thx!
Привет и спасибо! С вашим решением теперь называется метод Renewal() спонсора. Но когда я возвращаю TimeSpan.FromHours (1), иногда он будет работать, а иногда и нет. Я уже много экспериментировал, но не могу понять ... btw: lease.CurrentState всегда «активен» в процессе обновления(), а не «Обновление». – Lukas
Обновление: теперь он работает. У меня были ссылки на другие объекты в моем удаленном объекте, которые также унаследованы от MarshalByRefObject. Аренда этих объектов также должна была быть возобновлена. – Lukas