问题标签 [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 投票
3 回答
1302 浏览

logging - 使用策略注入应用程序块进行日志记录

大家好

我想问一下,在这些情况下如何使用策略注入应用程序块来记录方法的进入和退出:

案例1: 在记录 Web 表单控件的事件处理程序的情况下,您知道该类假设 _Default 必须从类System.Web.UI.Page继承,因此我们不能从MarshalByRefObject类继承我们的类,因此日志记录将不起作用.

Case2:如果我们有一个静态类并且我们必须记录其中的方法,我们可以做些什么来从MarshalByRefObject calss 继承这个类,以便获得日志记录工作。

0 投票
5 回答
10667 浏览

c# - 如何用 C# 等良好但多继承的截断语言解决“必须是 MarshalByRefObject”?

如何用 C# 等良好但多继承的截断语言解决“必须是 MarshalByRefObject”?

问题很简单,在某些情况下你只需要从这个类继承(基础设施要求)。在这里真的无关紧要,哪种情况。那么,如果您已经从其他一些类(您的领域模型要求)继承,您会怎么做?

顺便说一句,好的应用程序框架,如 spring.net 始终确保您不必从此类继承,无论您需要将哪种基础设施应用于您的类。

我想知道我在这里得到-3票是为了什么?:)

0 投票
3 回答
2804 浏览

c# - 解决方法 .net 应用程序域仅按值传递对象

我正在开发一个严重依赖插件的.net 应用程序。应用程序本身包含与远程服务器的连接。

最近我深入研究了应用程序域,并将它们视为将插件代码与应用程序的其余部分隔离的理想解决方案。

然而,有一个很大的缺点使我无法实现用于托管插件的应用程序域。似乎没有办法通过引用另一个应用程序域来传递对象,而另一个应用程序域需要传递对连接对象的引用。

我希望有人能给我一个解决方法,这样我就可以传递对该对象的引用。

注意:创建代理是不可能的,连接层已经充当代理,因为类是自动生成的。

注意 2:不能使用 System.AddIn,因为它在紧凑框架上不可用。

0 投票
2 回答
1939 浏览

.net - .NET 远程线程模型

我想知道如何使用 MarshalByRef 对象在服务器端处理线程。

鉴于我的远程 MarshalByRef 课程:

客户端代码(单线程):

在服务器端,我们有两个写操作。我假设线程来自线程池。但是,由于该类是 MarshalByRef,因此两个操作都是单独的远程过程调用。他们会在单独的线程上运行吗?如果是,是否会在操作 1 完成之前执行操作 2?

PS:制作 MyRemotedClass MarshalByRef 是错误的决定。但我不能改变它,所以请不要提出这个建议。

0 投票
1 回答
2974 浏览

c# - 具有 MarshalByRefObject 字段的可序列化对象

好吧,我不确定这个问题之前是否被问过,所以如果它已经消失了。假设我们有两个这样的课程

如您所见,ClassA 持有对 ClassB 的引用,但 B 类继承自 MarshalByRefObject 类。我的问题是,当我尝试将 ClassA 传递给另一个 AppDomain 时,除了将 _data 字段作为透明代理传递给新的 AppDomain 之外,如何让 ClassA 以通常的方式序列化?

任何帮助表示赞赏:)

0 投票
1 回答
641 浏览

c# - 用于将 POCO 实例公开给其他 AppDomain 的通用容器 - 它是如何工作的?

我对另一个 SO 线程的这个答案很感兴趣,我希望有人可以帮助我阐明这个概念。

假设我有一个主 AppDomain 和一堆由主 AppDomain 创建和初始化的子 AppDomain。在伪代码中:

主要应用程序域:

子应用域:

在 Init() 期间,子 AppDomain 实例化一个 POCO 对象,根据定义,该对象是不可编组的。我们还假设我们不能在这方面修改它。

链接的答案表明,将它包装在一个Container<T>(它本身是可编组的)中应该允许它被传递回主 AppDomain。我理解这一点,因为它Container<MyInfo>是真正被传递的实例的代理。

我不明白的是主 AppDomain 怎么可能通过容器的代理访问容器中的 POCO 实例。我看到了重载的隐式转换运算符Container<T>,我知道它返回包含的 POCO 实例。但是该实例本身并没有被代理 - 它仍然在子 AppDomain 中!那么,这不应该中断吗?

这里到底发生了什么?

0 投票
1 回答
1026 浏览

c# - 带有 MarshalByRefObject 的单声道、可序列化对象

我正在尝试将 C# 应用程序移植到 .NET(客户端服务器),并且遇到了序列化问题。

Linux 客户端序列化和对象,但 Windows 服务器无法反序列化它,给出错误:


在类中找不到System.Runtime.Serialization.SerializationException字段“MarshalByRefObject+__identity”

反序列化是通过 BinaryFormatter 完成的:

有问题的类具有 Serializable 属性,并继承自 MarshalByRefObject。如果我删除 MarshalByRefObject 的继承,它工作正常。在 Windows 中一切正常,所以我假设这是一个特定于 Mono 的问题。

任何帮助/建议将不胜感激^_^

0 投票
3 回答
9751 浏览

c# - Passing data across appdomains with MarshalByRefObject

I'm having a little trouble passing some data between two .NET appdomains and I'm hoping someone on here can help me.

Basically what I have is a main application (Main) which loads assembly A and B into it's main domain, then when I run a plugin(C) Main calls a create domain method on B which creates a new domain and loads C and a instance of B into it, so that C can only access B and not the others.

B contains a pointer to the IDispatch of Main but only it seems to get it after it is loaded into the new domain with C. What I am trying to do is send a copy of the pointer from the new domain instance of B and send it to A which is still running in the default domain.

Just for the record I control A,B and C but not Main

Sorry if this is a bit hard to understand I tried my best to explain it.

Code:

In A:

In B:

So at the end it looks something like this:

Default Domain:

  • Main.dll
  • A.dll
  • B.dll

Plug in Domain:

  • B.dll
  • C.dll
0 投票
1 回答
1602 浏览

.net - 加速跨 AppDomain 通信

我正在尝试在多个 AppDomain 上并行执行一些逻辑。我这样做是因为我正在使用“不可更改”的遗留代码,并且我想通过并行化一些事情来提高性能。问题是,如果我在 1 个 AppDomain 中运行多个实例,它们都依赖于一些静态数据结构并相互干扰。

我的实现很简单。我想运行我的“ExecutionHarness”类的多个实例——每个实例都在它们自己的 AppDomain 中——所以我创建了一个类“ExecutionHarnessProxy:MarshalByRefObject”,我在每个 AppDomain 中实例化它(因为 ExecutionHarness 不继承自 MarshalByRefObject)。然后我只是将“ExecutionData[] data”参数传递给“ExecutionHarnessProxy.Execute()”方法。然后这个人调用“ExecutionHarness.Execute()”,一切都很好。

我现在的问题是,每当我将我的数据数组传递给代理类时,它都需要永远。ExecutionData 类具有 [Serializable] 属性,并且在功能上它都可以工作,但我想知道是否有任何方法可以加快速度。

  1. 如果我自己在 AppDomain 边界的两侧进行序列化/反序列化,会更快吗?
  2. 所有这些时间都花在序列化上吗?还是只是AppDomains之间序列化数据的传输?
0 投票
2 回答
1317 浏览

c# - MarshalByRefObject 的创造性使用

我一直在努力想弄清楚一些事情。所以,我正在寻找建议和研究材料(通过链接)。这是场景:

我们有一个库(例如,CommonLib),其中包含几个其他应用程序(例如,AppA、AppB、AppC 等)所需的资源。现在,当前的工作方式是 AppA 实例,检查特定端口是否可用。如果不是,那么它会启动 CommonLib(“嘿,醒来”)并启动服务。然后 AppA 很高兴,我们走了。

现在,我对 Remoting.Channels 进行了大量研究,得出的结论是,我正在启动一个基于被认为是“遗留”技术的应用程序。嗯……我不喜欢那样。老实说,WCF 的开销比我们需要的要多得多,而且在 Mono 中没有完全实现。我们的目标是多平台兼容性(Windows、Mono、Linux),因此我们正在研究所有选项。

首先,远程处理的想法开始了,因为我们希望 CommonLib 成为一个有保证的单一实例(据我所知,一个单一实例几乎只能保证是给定 AppDomain 中的一个单一实例 - 如果我可以随时纠正我'我错了)。无论如何,我意识到远程处理的力量并决定开始一些实验性的实施。我在最初使用 MarshalByRefObject 时取得了成功。但是,我担心这种遗留技术的继续实施。

所以,有了这一切......我正在考虑如何实现 CommonLib(作为主机应用程序),并且在没有远程处理的情况下,通过 Stream、标准 TCP 套接字或其他方式实现 MarshalByRefObject。我在想的是,与其实例化 AppA 来运行 CommonLib,不如将 CommonLib 实现为基础应用程序。然后,您选择要在 CommonLib 中实例化的应用程序(实际上只是一个“托管”.dll)。CommonLib 然后将该 .dll 连同托管应用程序使用的任何自定义控件一起加载到 CommonLib 框架中。除了这个想法,我会放弃(现在)CommonLib 必须是真正的单例的要求。

所以...这是我们场景的一个细节。同样,我的问题实际上是两部分:(a)我应该研究什么技术,以及(b)我是否需要关注远程技术的遗留状态?

任何其他建议、评论或问题都非常受欢迎。

更新 1:我从这个片段开始。这将允许我加载包含已安装应用程序(或插件)列表的文件(或脚本)。我可以将此文件创建为 Xml 或二进制格式。安装新应用时,可以添加文件和路径。嗯...我不一定需要使用 MarshalByRefObject。