55
|
Guillaume · 技术社区 · 15 年前 |
![]() |
1
42
请看这里的答案: 基本上说:
|
![]() |
2
13
我终于找到了一种方法来执行客户端激活的实例,但它涉及Finalizer中的托管代码:( 我的类专门用于跨应用程序域通信,但您可以修改它并尝试在其他远程处理。 如果你发现什么虫子就告诉我。 以下两个类必须位于加载到所有相关应用程序域中的程序集中。
现在是CrossAppDomainObject,您的远程对象必须继承自这个类,而不是MarshalByRefObject。
|
|
3
6
不幸的是,当AppDomains用于插件时,这个解决方案是错误的(插件的程序集不能加载到主appdomain中)。 构造函数和析构函数中的GetRealObject()调用将获得远程对象的实际类型,这将导致尝试将远程对象的程序集加载到当前AppDomain中。这可能会导致异常(如果无法加载程序集),或者导致加载了以后无法卸载的外部程序集产生不必要的影响。 一个更好的解决方案是使用client sponsor.register()方法在主AppDomain中注册远程对象(而不是静态的,因此必须创建一个客户端发起实例)。默认情况下,它将在每2分钟更新你的远程代理,如果你的对象有默认的5分钟生存时间就足够了。 |
![]() |
4
1
我创建了一个在销毁时断开连接的类。
|
![]() |
5
1
这里有两种可能的解决方案。 Singleton方法:重写InitializeLifetimeService
作为
Sacha Goldshtein points out in the blog post
由原始海报链接,如果封送处理的对象具有单例语义,则可以重写
然而,正如用户266748在 another answer
基于类的方法:使用ClientSponsor
一个更普遍的解决方案是
在远程处理API中,生命周期管理的工作方式毫无价值,它是 described quite well here on MSDN . 我引用了我认为最有用的部分:
|
![]() |
6
0
您可以尝试一个可序列化的单实例ISponsor对象来实现IObjectReference。当context.State为CrossAppDomain时,GetRealObject实现(来自IObjectReference)应返回MySponsor.Instance,否则返回自身。实例是一个自初始化的、同步的(MethodImplOptions.synchronized)单例。更新实现(来自ISponsor)应检查静态MySponsor.IsFlaggedForUnload,并在标记为unload/AppDomain.Current.isFinalingForUnload()或返回LifetimeServices.RenewOnCallTime时返回TimeSpan.0,否则。 要附加它,只需获得一个ILease和Register(MySponsor.Instance),由于GetRealObject实现,它将被转换为AppDomain中的MySponsor.Instance集。 若要停止赞助,请重新获取ILase并注销(MySponsor.Instance),然后通过跨应用程序域回调(myPluginAppDomain.DoCallback(MySponsor.FlagForUnload))设置MySponsor.IsFlaggedForUnload。 在取消注册调用、FlagForUnload调用或AppDomain unload调用之前,这将使对象在另一个AppDomain中保持活动状态。 |
![]() |
7
0
我已经测试过这一个,它的工作很好,当然我们必须知道代理永远存在,直到你为自己做GC ing。但我的情况是,使用一个插件工厂连接到我的主应用,没有内存泄漏或类似的事情。我只是确定,我正在实现IDisposable并且它工作正常(我可以说,因为一旦正确地释放了工厂,我加载的dll(在工厂中)就可以被覆盖) 编辑:如果您的冒泡事件通过域,请将这一行代码添加到创建代理的类中,否则您的冒泡也将引发;) |
![]() |
8
0
如果希望在垃圾回收后重新创建远程对象,而不必创建
|
![]() |
9
0
对于那些希望对.NET远程处理框架有更深入了解的人,我建议您阅读以下文章 " Remoting Managing the Lifetime of Remote .NET Objects with Leasing and Sponsorship " 发表于 MSDN Magazine December 2003 issue . |
![]() |
10
-2
我最近也遇到过这个例外。现在我的解决方案是卸载AppDomain,然后在长时间间隔后重新加载AppDomain。幸运的是,这个临时解决方案对我的案子有效。我希望有一个更优雅的方式来处理这个问题。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |