问题标签 [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.

0 投票
1 回答
1236 浏览

c# - 从辅助域调用主应用域中的方法并获取值

我正在为我的 C# IRC Bot 实现一个模块系统。这些模块是 .dll 程序集,它们存储在子目录“模块”中,它们用于向机器人添加功能,例如在 IRC 上添加额外的命令。这些模块设计为在运行时加载和卸载,因此我可以更新机器人或修复错误,而无需重新启动整个应用程序。

目前,模块系统AppDomain为每个要加载的模块创建一个新的,并CreateInstanceFromAndUnwrap在一个名为ModuleHelper.

此代理继承自MarshalByRefObject.

OnLoadOnUnload在加载或卸载模块时调用。模块也继承自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 中的机器人计数(除其他外)?AddOnLoad

0 投票
1 回答
500 浏览

.net - MarshalByRefObject 是如何实现的?

我想知道它MarshalByRefObject是如何实现的,以及为什么它可以在远程处理中通过引用传递对象。

是否有可能是因为MarshalByRefObject类的实现,或者远程库只是检查类是否派生自MarshalByRefObject

0 投票
2 回答
14672 浏览

c# - 原始类型的透明代理

我有一个 {System.Runtime.Remoting.Proxies.__TransparentProxy} 类型的运行时对象,它是从继承自 ContextBoundObject 的类的实例创建的。此类向其他对象引发事件,我需要将此代理对象转换为原始对象。所有对象都在单个系统上的默认 AppDomain 中。

如何将它们转换为原始对象?如果在同一内存上运行,为什么会创建代理

0 投票
1 回答
1103 浏览

c# - 简单的跨应用程序对象中的内存泄漏

我正在尝试跨 AppDomain 对象,发现一件很奇怪的事情。

当我调用一个远程方法时,它分配了一个 MemoryStream 对象并返回它的引用(并且由调用者立即释放),内存使用量显着增加并且没有下降,即使在调用 GC.Collect() 之后也是如此。

在每次返回 new String 或 byte[] 对象的调用方法上,没有泄漏。

内存分析器显示大多数活动对象的类型为 Char[] 和字符串(在 MemoryStream 的情况下)。

问题是——我是不是误会了什么,远程调用不像从 MarshalByRefObject 继承那么简单?

0 投票
2 回答
3473 浏览

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

我究竟做错了什么?

0 投票
1 回答
4086 浏览

xml - JAXB 可以先通过遏制封送,然后通过@XmlIDREF 封送以供后续参考吗?

我想知道是否可以注释我的类,以便编组器第一次遇到一个对象时,它会生成一个适当类型的 XML 元素,但是任何其他对该对象的后续引用都会创建一个 XML IDREF 条目?

0 投票
1 回答
168 浏览

.net - 从服务器端列表中删除断开连接的 MarshalByRefObjects

在 .Net 远程处理中,如果创建了一个远程对象列表,那么如果远程端离开并且您尝试访问其中一个列表项,您将获得异常。

一切都很好,你可以尝试抓住它,而不是世界末日。

但是,如果您尝试MarshalByRefObject从 a中删除断开连接,则会出现List<MarshalByRefObject>另一个异常,因为List.Remove()使用Object.Equals()并且无法清理列表。

是否应该使用对象的某种本地包装器来解决这个问题,MarshalByRefObject还是有更清洁的方法?

0 投票
2 回答
4820 浏览

.net - 混合 MarshalByRefObject 和 Serializable

各种消息来源解释说

当对象从 MarshalByRefObject 派生时,对象引用将从一个应用程序域传递到另一个应用程序域,而不是对象本身。当一个对象被标记为 [Serializable] 时,该对象将被自动序列化,从一个应用程序域传输到另一个应用程序域,然后反序列化以在第二个应用程序域中生成该对象的精确副本。请注意,当 MarshalByRefObject 传递一个引用时,[Serializable] 会导致对象被复制。[资源]

我正在设计我的第一个使用 AppDomains 的应用程序,我想知道当您将引用MarshalByRefObjects放在不实现 MarshalByRefObject 的可序列化对象内部时会发生什么,因为到目前为止我找不到有关该主题的任何文档。

例如,如果我尝试返回跨 AppDomain 边界的List<MBR>where会发生什么?MBR : MarshalByRefObject我是否得到原始对象的List<MBR>where each MBRis a 的副本?TransparentProxy是否有任何关于混合这两种机制的技术细节的文档?

0 投票
2 回答
969 浏览

.net - 如何检测 MarshalByRefObject 是本地的还是远程的?

换句话说,我如何判断我是否引用了透明代理或本地对象?

0 投票
1 回答
309 浏览

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 ?