Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MarshallByRefObject生存期_C#_Vb.net_Remoting_Appdomain_Object Lifetime - Fatal编程技术网

C# MarshallByRefObject生存期

C# MarshallByRefObject生存期,c#,vb.net,remoting,appdomain,object-lifetime,C#,Vb.net,Remoting,Appdomain,Object Lifetime,我有一个.net WinForms应用程序,它将插件(dll)加载到它们自己的AppDomain中,每个dll使用domain.CreateInstanceAndUnwrap()获得自己的AppDomain。我只希望这些对象永远保持连接(直到应用程序停止)。 最初的时间是5分钟,但我找不到改变的方法。。 我尝试覆盖远程对象的InitializeLifetimeService(): Public Overrides Function InitializeLifetimeService() As O

我有一个.net WinForms应用程序,它将插件(dll)加载到它们自己的AppDomain中,每个dll使用domain.CreateInstanceAndUnwrap()获得自己的AppDomain。我只希望这些对象永远保持连接(直到应用程序停止)。
最初的时间是5分钟,但我找不到改变的方法。。 我尝试覆盖远程对象的InitializeLifetimeService():

Public Overrides Function InitializeLifetimeService() As Object  
     Return Nothing  
End Function
这里我得到一个Typeload异常,表示这将破坏继承规则。 添加

也不这样做,因为赞助商的Renewal()方法(此处未显示)从未被调用

召唤

lease.Renew(TimeSpan.FromMinutes(300))
直接更改租约的当前租约时间,但不更改租约的初始租约时间

最后,我尝试调用共享(静态)属性LeaseTime,这实际上导致在租约开始时更改CurrentLeaseTime,但再次不是初始LeaseTime,它似乎在5分钟后结束,我的远程对象被gc'ed:

LifetimeServices.RenewOnCallTime = System.TimeSpan.FromMinutes(300)
感谢您的帮助,
谢谢

不确定发生了什么,但下面是它的工作原理

var sponsor = new Sponsor();  // manages lifetime of the object in otherDomain
var target = otherDomain.CreateInstanceFromAndUnwrap(assemblyFilename, typeFullName) 
    as MarshalByRefObject;

var lease = target.InitializeLifetimeService() as ILease;
lease.Register(sponsor);
在这种情况下,只需保留对目标(显然)和发起人的引用。赞助商是管理订阅的类:

class Sponsor : MarshalByRefObject, ISponsor
{
    public bool Release { get; set; }

    public TimeSpan Renewal(ILease lease)
    {
        // if any of these cases is true
        if (lease == null || lease.CurrentState != LeaseState.Renewing || Release)
            return TimeSpan.Zero; // don't renew
        return TimeSpan.FromSeconds(1); // renew for a second, or however long u want
    }
}

完成后,只需在赞助商上将Release设置为
true
,然后放手。您也可以通过在赞助商上实现IDisposable来处理此问题,如果您喜欢的话。

您好,谢谢!在您的解决方案中,现在会调用发起人的续订()方法。但是,当我返回TimeSpan.FromHours(1)时,它有时会工作,有时不会。我现在已经做了很多实验,但没有弄明白…顺便说一句:lease.CurrentState在renewal()中始终是“活动”的,而不是“续订”。更新:它现在正在工作。我的远程对象中有其他对象的引用,这些对象也是从MarshalByRefObject继承的。这些物品的租约也必须续期。
var sponsor = new Sponsor();  // manages lifetime of the object in otherDomain
var target = otherDomain.CreateInstanceFromAndUnwrap(assemblyFilename, typeFullName) 
    as MarshalByRefObject;

var lease = target.InitializeLifetimeService() as ILease;
lease.Register(sponsor);
class Sponsor : MarshalByRefObject, ISponsor
{
    public bool Release { get; set; }

    public TimeSpan Renewal(ILease lease)
    {
        // if any of these cases is true
        if (lease == null || lease.CurrentState != LeaseState.Renewing || Release)
            return TimeSpan.Zero; // don't renew
        return TimeSpan.FromSeconds(1); // renew for a second, or however long u want
    }
}