问题标签 [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 回答
504 浏览

c# - 加载程序集时发生冲突的依赖项

我在尝试编写插件处理程序时遇到了一些问题。

我有一个主应用程序“AppA”,它引用“AssemblyX”。

AppA 还加载了许多实现“IPlugin”接口的插件程序集。但是,这些插件也可能引用“AssemblyX”,甚至可能是旧版本。

所以最初的问题是通过 Assembly.LoadFrom() 加载插件时发生的与 AssemblyX 的冲突。

经过对这里的一些研究,我尝试将插件加载到新的 AppDomain 中。这本身并没有解决问题。接下来我创建了一个继承自 MarshalByRefObject 的 ProxyDomain 类。仍然没有喜悦。

最后,我让插件本身继承自 MarshalByRefObject,这确实取得了更大的成功,但是当我尝试将 List 绑定到 ListView 时,它抱怨“System.MarshalByRefObject”不包含名为“SomeProperty”的属性”。

请有人看一下我的代码,看看是否可以进行任何更改:

注意:PluginExamples.dll 可能包含多个插件类。

0 投票
1 回答
572 浏览

c# - 创建从 AppDomain 引用的对象的本地实例

我试图找出是否有一种方法可以创建从应用程序域引用的我的对象的本地实例,原因是在该方法的所有执行过程中我得到了大量的喋喋不休。因此,不必一直调用远程对象,我只想调用在方法内创建的本地实例。

我一直在研究 RemotingServices Marshal 和 GetObjectData 方法,但无法弄清楚它们是否有效,谷歌也没有帮助

所以类定义如下

然后运行时类的一个实例看起来像这样。

我希望按照以下方式完成我所需要的

调用 GetRealObject 时出现以下错误 “尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”

我仍然没有找到任何方法来实现这一点,有人可能有一些建议吗?

0 投票
0 回答
1150 浏览

c# - 在 .Net 中使用 MarshalByRef 时内存泄漏

我遇到了一个有趣的问题,我猜这真的是双重的。不过,我会尽量保持专注。我设置了一个环境,其中以编程方式编译程序集并将其加载到子应用程序域中。该子应用程序域程序集中的一个类被实例化(它实际上被封送回父域并在那里使用代理),并针对它执行方法。

以下内容位于附属程序集中:

从子应用程序域中解包出来的类应该实现上面的接口。上面代码中的 SandboxLoader 也运行在子应用域中,并起到创建目标类的作用。这一切都由下面的 ScriptingHost 类绑定,该类在主程序集的父域中运行。

作为参考,编译的 ScriptingDemo.vb 文件:

我遇到的第一个问题是,即使在清理沙箱之后,内存仍然泄漏。这是通过保留沙箱实例而不在执行脚本中的方法后将其销毁来解决的。这向 ScriptingHost 类添加/更改了以下内容:

这确实没有解决根本问题(破坏沙箱和加载程序没有按预期释放内存)。不过,由于我对这种行为有更多的控制权,它确实让我可以继续讨论下一个问题。

使用 ScriptingHost 的代码如下所示:

MyClass 的代码:

正如代码所示,随着迭代次数的增加和 GCHandles 的飙升,内存会慢慢泄漏。我玩过添加一个有限租约而不是将租约设置为永不过期,但这会导致内存的剧烈波动,最终会下降但不完全,最终仍然比当前解决方案消耗更多的内存(相差几十兆字节)。

我完全理解创建大量这样的类并在不久之后将它们删除是不可取的,但它模拟了一个更大的系统。我们可能会也可能不会解决这个问题,但对我来说,我想更好地理解为什么当前系统中的内存泄漏。

编辑:

我只是想指出内存泄漏似乎不是托管内存。使用各种分析工具,托管堆似乎倾向于保持在一个相当设定的范围内,而非托管内存似乎在增长。

编辑#2

重写代码以保留类列表而不是每次迭代都转储它们似乎可以缓解问题(我的假设是这可行,因为我们正在重用我们已经分配的所有内容),但我想保留这个如果只是为了学术活动而开放。根本问题仍未解决。

0 投票
1 回答
539 浏览

c# - 使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象

我创建了一个输出类型为 netmodule 的 C# 代码。这是在 C++ 代码中使用的。

我想创建一个已经加载的同一个程序集的对象。但是,在一个单独的 AppDomain 中。但是这样做时,我无法加载程序集以使用 CreateInstanceAndUnwrap 方法创建对象。当尝试使用独立的 C# 代码执行相同操作时,它可以正常工作。

C++:

C#

我打印了 AssemblyName 并发现它是从 C++ 代码编译的 dll 的名称。从独立 C# 尝试时,它是 exe 的名称。

这是一起使用 C++ 和 C# 时创建 AppDomain 的正确方法吗?或者我在创建 AppDomain 时犯了任何错误。请协助。

0 投票
1 回答
533 浏览

c# - 使用 appdomains 时无法设置同步上下文

我有一个自定义框架,其中主机应用程序运行事件循环并将来宾应用程序加载到单独的应用程序域中。来宾应用程序可以通过提供的 API 来利用事件循环。我想让来宾应用程序能够自动将所有延续传播到事件循环中,就像在 .NET GUI 应用程序和 UI 线程中所做的那样。因此,我创建了一个能够做到这一点的自定义同步上下文。

但问题是我无法开始使用这个新的上下文。每当我尝试设置它时,它都会null在跨应用程序域边界的下一个回调中重置。

这里有一个快速的代码片段来说明这个问题:

输出:

SynchronizationContext.SetThreadStaticContext如果它在桌面上可用,还有一种方法可以潜在地解决上述问题。

当然,总有一种方法可以在执行任何其他工作之前在每个回调中显式设置上下文。但这似乎有点糟糕。除此之外,我看不到解决这个鸡蛋问题的优雅方法。顺便说一句,它在 Mono 上按预期工作。

0 投票
1 回答
407 浏览

c# - 远程调用的 MarshalByReferenceObject 中的呼叫者 ID

我有一个MarshalByReferenceObject,其方法是通过 .net 远程处理调用的。

客户端像这样调用服务器:

现在出于调试目的,当客户端调用 DoSomething() 方法时,我想记录实际调用者是谁。

如何从我的 server.DoSomething() 函数中识别调用方法?或者从我的服务器构造函数中,它由 Activator.GetObject 调用?

理想情况下,我想要整个堆栈跟踪:哪个客户端方法调用服务器,哪个父方法调用该客户端方法,等等。但我会接受某种来电显示。我控制着客户,所以也许我可以以某种方式给他们起名字?string callerId接口规范已经非常固定,所以我想避免为每个方法添加一个多余的参数。

本地堆栈跟踪当然只识别System.Runtime.Remoting方法,而不是实际的远程调用者。


服务器端的示例堆栈跟踪:

这显然不能帮助我识别来自客户端的调用方法。

0 投票
0 回答
71 浏览

c# - 为什么我收到 marshal_by_reference 警告

这是我的代码的简化版本:

这是警告:

访问“Master.TradingPausedDT”上的成员可能会导致错误,因为它是 marshal-by-reference 类的字段。

为什么我会收到此警告?

0 投票
0 回答
1162 浏览

c# - 我可以在不受信任的代码中覆盖 MarshalByRefObject.InitializeLifetimeService 吗?

我有一些用于将程序集加载到沙盒 AppDomain 的代码(PermissionSet 使用PermissionState.None初始化)。我想将数据从我的主 AppDomain 来回传递到沙盒 AppDomain 中的程序集。通过使我的数据扩展MarshalByRefObject,它可以通过引用传递。问题是这些对象然后在内存中徘徊。我希望尽快收集它们(大多数情况下在几秒钟内)。当我尝试覆盖InitializeLifetimeService时,出现运行时错误。

我整理了一些示例代码来演示这个问题。我的代码分为三个项目:

类库:沙盒(必须签名)

文件名:Sandbox.cs(基于此 stackoverflow 答案

类库:插件

文件名:插件.cs

文件名:SharedData.cs

控制台项目:示例

文件名:Program.cs

错误发生在Sandbox.CreateInstance调用this.assembly.GetType(). 我得到的信息是:

覆盖成员时违反了继承安全规则:“Plugins.SharedData.InitializeLifetimeService()”。重写方法的安全可访问性必须与被重写方法的安全可访问性相匹配。

似乎 InitializeLifetimeService 需要比我想给不受信任的插件更多的安全性。如果我在 Plugins 库之外定义 SharedData 类并尝试将其传入(一旦它尝试通过引用编组对象),我会收到类似的错误。

有什么方法可以使这项工作不必诉诸按值复制和序列化?

编辑:仅供参考,我确实最终使用了序列化。这很痛苦,特别是对于数据被更改并且我必须再次序列化才能返回它的地方,但至少它可以工作。我很想知道是否有人可以通过编组来完成这项工作。

0 投票
0 回答
284 浏览

c# - 在不同的 AppDomain C# 中运行插件

我在尝试在新的 AppDomain 中运行 .dll 时遇到了困难。我的对象总是 type System.MarshalByRefObject,所以我无法从插件中获取方法。

我现在拥有的是一个插件,它实现了一个接口并扩展了一个MarshalByRefObject,如下所示:

然后我的插件是这样实现的:

所以我构建了插件,得到了 dll,把它放在一个文件夹中,现在在我的项目中,我试图像这样加载它:

但它崩溃了Execute.Invoke(...),因为它不知道方法Execute,因为对象的类型错误。

错误信息是:

未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。

0 投票
1 回答
74 浏览

c# - 在不使用 GetTypes 的情况下查找从 X 继承的主类?

我有一个按需加载插件的应用程序(使用 AppDomain 和 MarshalByRefObject),我试图找到一种不同的方法来验证插件。

现在,我确定了这样的可运行插件:

但是,如果其中一个插件被混淆,GetTypes 将立即失败:

因此,这种方法不允许我同时运行混淆和非混淆插件。

我知道我会要求插件具有接口导入的方法和主类不被混淆才能工作。

简而言之,有没有办法找到我的主类,它继承自提到的 2 个接口(IPlugin 或 IPluginChat)之一,而不必使用无法读取混淆类型的 GetTypes?