问题标签 [appdomain]

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 回答
3779 浏览

c# - Type.IsSubclassOf 的行为不符合预期

我有一个应用程序,它加载程序集并查找作为应用程序引用的另一个程序集 A1 中定义的类 C1 的子类的类型。我在 A1 中定义了一个类型 T,它是 C1 的子类,但是当我使用 Assembly.Load(...) 加载 A1 时,然后在 TI 的实例上调用 t.IsSubclassOf(typeof(C1)) 得到 false。我注意到当前 appdomain 中有 2 个程序集 A1 实例,如果我从其中一个实例中获取类型 C1 而不是两个实例,则 t.IsSubclassOf(C1) 可以工作。我不太明白这种行为,谁能解释一下?此外,我如何修复我的应用程序,以便无论加载 A1 还是其他程序集以查找 C1 的子类型,它都能正常工作?

0 投票
3 回答
4923 浏览

c# - 最低跨 AppDomain 通信性能损失是多少?

我试图将在同一台机器上跨 AppDomain 进行通信的性能损失降到最低。在我的玩具示例中,A 类加载到 AppDomain 1 中。它创建一个 AppDomain 2 并在那里加载一个类 2 的实例(类 2 继承自 MarshalByRef)以获取代理。然后类 1 重复调用代理上的一个不返回值的方法。

我得到以下结果:

  1. 没有 AppDomain,两个类都加载在同一个 AppDomain 中,第一个类重复调用第二个方法(该方法没有参数):2400 万次方法调用/秒
  2. 如上所述的两个 AppDomain,方法没有参数或“出血”字符串参数:340.000 个方法调用/秒
  3. 如上所述的两个 AppDomain,一个可序列化参数(两个字符串的数组):64.000 次方法调用/秒

虽然我了解 2 和 3 (序列化)之间的性能损失,但我真的不明白为什么我从 case 1 到 case 2 慢了 100 倍。据我了解,一旦创建了代理,所有后续方法调用都必须非常快,因为没有数据从一个 AppDomain 编组到另一个。有人现在为什么跨 AppDomains 的通信如此缓慢?难道我做错了什么?

PS1。我对此的唯一提示是 “跨越 AppDomain 边界的成本令人尴尬。”。我猜他指的是序列化......

PS2。我不计算 AppDomain 或代理创建时间(我的基准测试从第一个方法调用开始)

PS3。我在 WinXP SP3 机器上使用 .NET 3.5。我还尝试了没有显着差异的 .NET 4.0 Beta 1。

0 投票
3 回答
930 浏览

.net - 用于在同一进程中的 .Net AppDomain 之间进行通信的底层机制是什么?

我意识到一个理性的下意识反应会是“远程处理你这个白痴!阅读 MSDN 文档。” 我能找到的关于 .Net Remoting 的每一条信息都在进程间通信的上下文中:套接字、共享内存、管道......在 IPC 方面的经典之作,但 AppDomain 并不是一个真正的进程。然而,AppDomains 似乎享有成为一体的大部分好处。从学术角度来看,与驻留在同一进程中的实体之间的通信相比,OS IPC 原语很重。当通信跨越同一进程内的 AppDomain 边界时,是否使用了特殊的 AppDomain 管道?我对此表示怀疑。如果 MS 改变了 Windows 内核中进程隔离的基本原理以适应 AppDomain,我会感到震惊。

0 投票
3 回答
4732 浏览

c# - 在运行时加载 2 个版本的程序集

在过去的几周里,我一直在尝试破解这个问题,但还没有找到好的解决方案;希望我能在这里得到答案。

我有两个程序集(ZA 和 ZB),它们都指向一个公共项目/dll(ZC),但它们可能位于不同的版本(即相同的 dll 名称、相同的命名空间、某些类可能不同)。每个程序集自己工作,但是,如果一个程序集在运行时由另一个程序集加载(例如 A 加载 B),那么我无法让它工作。需要一些帮助。

这是设置:

  • ZA 依赖于 ZC(通用)版本 1.1
  • ZB依赖ZC 1.0版本

ZA需要加载需要在运行时在ZB中加载一些东西(这取决于ZC)。

ZA 是主应用程序。在它bin的目录plugins/plugin-ZB下,有一个插件目录,我想在其中放置所有 ZB 及其依赖项 (ZC)。

这是我到目前为止所尝试的:

Assembly.Load()使用相同版本的 dll - 工作正常。

Assembly.Load()使用不同版本的 dll - ZB 加载,但是当方法运行时,我得到一个方法未找到异常。

AppDomain.Load()找不到文件错误;我什至使用委托来解析程序集。

关于 ZC 的一些细节: - 一些方法是公共静态的(有些不是)。例如Log.Log("hello"); - 有些可能返回值(基元或对象)。- 一些方法是非静态的(并且返回值)。

帮助?- TIA

0 投票
2 回答
4083 浏览

c# - 为 AppDomain.AssemblyResolve 设置异常处理程序

创建一个新的应用程序域,设置 assemblyResolve 处理程序,你总是会得到一个异常,说“未找到程序集 [当前正在执行的程序集]”

是什么赋予了 ?代码如下

例外是:

System.IO.FileNotFoundException:无法加载文件或程序集“appAdmin,版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。文件名:'appAdmin,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' [snip]

0 投票
3 回答
14266 浏览

c# - 如何将变量从一个应用程序域传递到另一个应用程序域

我想知道,如果我有一个变量,例如一个字符串,如何将它的值传递给我的新应用程序域:

谢谢

0 投票
1 回答
8459 浏览

c# - 来回传递值 appdomains

我有以下代码:

我认为这样做会让我的 ada.myString 有“工作”!在主 appdomain 上,但它没有。我认为通过从 MarshalByRefObject 继承,对第二个 appdomain 所做的任何更改也会反映在原来的那个中(我认为这只是主 appdomain 上真实对象的代理!)?

谢谢

0 投票
2 回答
4809 浏览

c# - AppDomain 是否等同于 .NET 代码的进程?

我不得不调用一些写得很糟糕的第 3 方 COM 组件,它们存在内存泄漏并在长时间运行的进程中使用单线程单元 [STA]。

我知道单独的进程将是实现它的好方法,我可以偶尔从长时间运行的进程中重新启动它。

可以改用 AppDomain 吗?如果标记得当,AppDomain 线程是 STA 线程吗?它是否有自己的 COM 对象内存?卸载 AppDomain 是否相当于杀死进程?

0 投票
2 回答
486 浏览

c# - AppDomains 和许可文件

我们有一个使用第三方组件的 dll,带有嵌入式许可证文件 (licx)。现在我们正在尝试在 Windows 服务应用程序中使用我们的 dll,使用多个应用程序域。代码被编译。但是当我运行它时,我收到一条错误消息,说找不到运行时许可证。

有人可以解释一下吗?在单个域中使用 dll 时,它工作正常。请帮忙。

谢谢。

0 投票
2 回答
5816 浏览

.net - .NET:使用 AppDomains 引发和处理事件的问题

这是我的问题的基本要点:

  1. 我的主窗口类实例化了 A 类。
  2. A 类在辅助 AppDomain中实例化 B 类。
  3. B 类引发事件,A 类成功处理该事件。
  4. A 类引发了它自己的事件。

问题:在第4步中,当A类从捕获B类事件的事件处理方法中引发自己的事件时,该事件被引发;但是,从不调用 Window 类中的订阅处理程序。

没有抛出异常。如果我删除辅助 AppDomain,则事件将毫无问题地得到处理。

有谁知道为什么这不起作用?有没有另一种方法可以在不使用回调的情况下完成这项工作?

我认为,如果有的话,问题将出现在第 3 步而不是第 4 步。

这是一个真实的代码示例来说明问题: