Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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# 取消注册租约引发InvalidOperationException_C#_.net_Appdomain - Fatal编程技术网

C# 取消注册租约引发InvalidOperationException

C# 取消注册租约引发InvalidOperationException,c#,.net,appdomain,C#,.net,Appdomain,我有一个使用插件的应用程序。我将插件加载到另一个appdomain中。 我使用RemoteHandle类来防止对象在5分钟后被垃圾收集 只要我的应用程序在运行,这就很有效,但当它关闭时,我在注销时会收到InvalidOperationException internal static void Unregister(MarshalByRefObject value) { if (value != null && RemotingServices.IsTra

我有一个使用插件的应用程序。我将插件加载到另一个appdomain中。 我使用RemoteHandle类来防止对象在5分钟后被垃圾收集

只要我的应用程序在运行,这就很有效,但当它关闭时,我在注销时会收到InvalidOperationException

internal static void Unregister(MarshalByRefObject value)
    {
        if (value != null && RemotingServices.IsTransparentProxy(value))
        {
            lock (_syncLock)
            {
                ReferencedLease r;
                if (_leaseReferences.TryGetValue(value, out r) && --r.ReferenceCount <= 0)
                {
                    // Note: Dictionary clears key and value from bucket list upon remove.
                    _leaseReferences.Remove(value);
                    r.Lease.Unregister(_instance); // <----- Here i get the exception

                }
            }
        }
    }

为什么会出现这种异常?

我会订阅app domains Unload事件,查看应用程序域是否已经卸载。如果是这样,那么我怀疑您不再需要注销该句柄(只需吞下异常),因为CLR已经为您完成了这项工作。这只是一个理论,但可能会给您提供更多信息。

您会遇到此异常,因为代码正在终结器线程中运行。您正在引用已完成的对象。最终确定对象的顺序是不确定的


这就是它的原因,从片段中我不清楚你会怎么做。

我在Pocket Silicon上写了一篇原始文章。我们也遇到过这个问题,我们目前的工作是在这里捕获异常。我想知道外域是否仍然存在,但尚未找到(是的,我可以让该域告诉我它何时消失,但我不希望对远程对象提出额外要求)

下面是我们当前使用的catch块:

try
    {
        // Catch here -- if we are finalizing we may have already
        // finalized the weak handle in the table or the lease may
        // have already been unloaded.
        r.Lease.Unregister(Sponsor.instance);
    }
    catch (InvalidOperationException) { }
    catch (AppDomainUnloadedException) { }

我会更新帖子。

没错。域被卸载,然后我尝试处理下一个插件。。。我可以将两者都设置为已接受吗?这是正确的。域被卸载,然后我尝试处理下一个插件。。。我可以将两者都设置为已接受吗?
try
    {
        // Catch here -- if we are finalizing we may have already
        // finalized the weak handle in the table or the lease may
        // have already been unloaded.
        r.Lease.Unregister(Sponsor.instance);
    }
    catch (InvalidOperationException) { }
    catch (AppDomainUnloadedException) { }