问题标签 [marshalbyrefobject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 从辅助域调用主应用域中的方法并获取值
我正在为我的 C# IRC Bot 实现一个模块系统。这些模块是 .dll 程序集,它们存储在子目录“模块”中,它们用于向机器人添加功能,例如在 IRC 上添加额外的命令。这些模块设计为在运行时加载和卸载,因此我可以更新机器人或修复错误,而无需重新启动整个应用程序。
目前,模块系统AppDomain
为每个要加载的模块创建一个新的,并CreateInstanceFromAndUnwrap
在一个名为ModuleHelper
.
此代理继承自MarshalByRefObject
.
OnLoad
并OnUnload
在加载或卸载模块时调用。模块也继承自MarshalByRefObject
外部程序集,例如模块中的此类,ConfigurationReader.dll
.
问题是,当我修改属于主 appdomain 的内容时(特别是,将新机器人添加到 IrcBot.Bots 集合中IrcBot.Bots.Add(_configuration.Id, bot);
),IrcBot.Bots
计数仅在辅助 appdomain 内增加,而不是我想要的主 appdomain .
做了一点Console.WriteLining后发现,在二级appdomain调用IrcBot.Bots.Count
后调用返回1,在主appdomain调用返回0后直接再次调用。这样的后果是灾难性的,并导致其他模块加载后发生故障。在辅助 AppDomain 中更改后,如何更新主 AppDomain 中的机器人计数(除其他外)?Add
OnLoad
.net - MarshalByRefObject 是如何实现的?
我想知道它MarshalByRefObject
是如何实现的,以及为什么它可以在远程处理中通过引用传递对象。
是否有可能是因为MarshalByRefObject
类的实现,或者远程库只是检查类是否派生自MarshalByRefObject
?
c# - 原始类型的透明代理
我有一个 {System.Runtime.Remoting.Proxies.__TransparentProxy} 类型的运行时对象,它是从继承自 ContextBoundObject 的类的实例创建的。此类向其他对象引发事件,我需要将此代理对象转换为原始对象。所有对象都在单个系统上的默认 AppDomain 中。
如何将它们转换为原始对象?如果在同一内存上运行,为什么会创建代理
c# - 简单的跨应用程序对象中的内存泄漏
我正在尝试跨 AppDomain 对象,发现一件很奇怪的事情。
当我调用一个远程方法时,它分配了一个 MemoryStream 对象并返回它的引用(并且由调用者立即释放),内存使用量显着增加并且没有下降,即使在调用 GC.Collect() 之后也是如此。
在每次返回 new String 或 byte[] 对象的调用方法上,没有泄漏。
内存分析器显示大多数活动对象的类型为 Char[] 和字符串(在 MemoryStream 的情况下)。
问题是——我是不是误会了什么,远程调用不像从 MarshalByRefObject 继承那么简单?
c# - 从 PowerShell 调用时无法在 dll 中转换透明代理,但在 C# 控制台应用程序中成功
我正在尝试创建一个开源库,该库会生成一个新库AppDomain
并在其中运行一个PowerShell
脚本。我有一个静态方法,它采用 powershell 文件的名称和AppDomain
. 从 C# 控制台应用程序调用该方法时成功执行,但不是PowerShell
.
由于fusionlog 中的此条目,我知道 dll 正在第二个应用程序域中加载。
类声明和构造函数看起来像这样。
无论我是从 C# 控制台应用程序还是从 PowerShell 应用程序运行 dll,当我调用CreateInstanceFromAndUnwrap时,构造函数中的该消息都会得到输出。
当我在下面的静态方法中将返回的值CreateInstanceFromAndUnwrap
转换为AppDomainPoshRunner时会发生故障。
在 PowerShell 中运行它时,我收到InvalidCastExcception
消息Unable to cast transparent proxy to type JustAProgrammer.ADPR.AppDomainPoshRunner
。
我究竟做错了什么?
xml - JAXB 可以先通过遏制封送,然后通过@XmlIDREF 封送以供后续参考吗?
我想知道是否可以注释我的类,以便编组器第一次遇到一个对象时,它会生成一个适当类型的 XML 元素,但是任何其他对该对象的后续引用都会创建一个 XML IDREF 条目?
.net - 从服务器端列表中删除断开连接的 MarshalByRefObjects
在 .Net 远程处理中,如果创建了一个远程对象列表,那么如果远程端离开并且您尝试访问其中一个列表项,您将获得异常。
一切都很好,你可以尝试抓住它,而不是世界末日。
但是,如果您尝试MarshalByRefObject
从 a中删除断开连接,则会出现List<MarshalByRefObject>
另一个异常,因为List.Remove()
使用Object.Equals()
并且无法清理列表。
是否应该使用对象的某种本地包装器来解决这个问题,MarshalByRefObject
还是有更清洁的方法?
.net - 混合 MarshalByRefObject 和 Serializable
各种消息来源解释说
当对象从 MarshalByRefObject 派生时,对象引用将从一个应用程序域传递到另一个应用程序域,而不是对象本身。当一个对象被标记为 [Serializable] 时,该对象将被自动序列化,从一个应用程序域传输到另一个应用程序域,然后反序列化以在第二个应用程序域中生成该对象的精确副本。请注意,当 MarshalByRefObject 传递一个引用时,[Serializable] 会导致对象被复制。[资源]
我正在设计我的第一个使用 AppDomains 的应用程序,我想知道当您将引用MarshalByRefObjects
放在不实现 MarshalByRefObject 的可序列化对象内部时会发生什么,因为到目前为止我找不到有关该主题的任何文档。
例如,如果我尝试返回跨 AppDomain 边界的List<MBR>
where会发生什么?MBR : MarshalByRefObject
我是否得到原始对象的List<MBR>
where each MBR
is a 的副本?TransparentProxy
是否有任何关于混合这两种机制的技术细节的文档?
.net - 如何检测 MarshalByRefObject 是本地的还是远程的?
换句话说,我如何判断我是否引用了透明代理或本地对象?
c# - Does .Net 4 inline MarshalByRefObject methods?
I have some code that relied on methods not being inlined :
Of course this does only work if the DoSomething method is not inlined. This is the reason why the base class derives from MarshallByRefObject
, which prevent inlining of public methods.
It worked until now, but I got a stacktrace from a .Net 4 server showing that the stackwalk reached the caller of DoSomething.
Is the .Net 4 inlining more clever and detect that MyClass is internal and has no chance of being substituted with a proxy ?