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

c# - 如何在单独的 AppDomain 中托管 IronPython 引擎?

我已经尝试了明显的:

但我收到以下错误消息:成员“Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting, Version=0.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的类型未解析。

到目前为止,谷歌搜索这个错误还没有被证明是富有成效的......

编辑#1:

我试图通过将相关内容复制到新的控制台应用程序来创建一个最小的复制项目:

这按预期工作!

因此,我可以得出结论,我得到的错误与我注释掉的一行有关:添加到引擎的范围包含一个我几乎无法控制的对象-对该软件旨在运行的插件主机的引用在(Autodesk Revit Architecture 2010)中。

也许试图通过那是造成错误的原因?

有没有办法通过代理来代替?(将不得不查找 .NET 远程处理...)

编辑#2:

我已将问题缩减为通过无法代理到另一个 AppDomain 的范围传递对象:添加到在不同 AppDomain 中运行的 IronPython 解释器范围的所有对象都必须以某种方式编组,因此必须扩展MarshalByRefObject或是Serializable

0 投票
5 回答
16499 浏览

c# - 如何检测应用程序何时终止?

这是我最初问题的后续,我想介绍我的发现并要求更正、想法和见解。我的发现(或者更确切地说是解释)来自人们对我之前的问题的回答,即阅读 MSDN .NET 3.5 文档和调试 .NET 3.5 代码。我希望这对像我一样想知道如何检测应用程序何时终止的人来说是有价值的。

事件:

  • System.AppDomain.CurrentDomain.ProcessExit: 在进程退出时引发,例如在默认值AppDomain和其他所有内容被卸载后[总执行时间仅限于 3 秒!]。对于 WPF,请System.Windows.Application.Exit改用。对于 Windows 窗体,Application.Run(...)在 main 方法之后运行代码。

  • System.AppDomain.CurrentDomain.DomainUnload:在AppDomain非默认AppDomain卸载时引发,例如在使用单元测试框架(MbUnit 和 TestDriven.NET)运行类时。

  • System.AppDomain.CurrentDomain.UnhandledException: (如果默认处理AppDomain:) 为任何线程中的任何未处理异常引发,无论AppDomain线程从什么开始。这意味着,这可以用作所有未处理异常的包罗万象。

  • System.Windows.Application.Exit:当 WPF 应用程序(即默认AppDomain)正常退出时引发。覆盖System.Windows.Application.OnExit以利用它。

  • 终结器(C# 中的析构函数):在垃圾收集器释放非托管资源时运行。[总执行时间有限!]。

事件顺序:

WPF 应用程序:优雅退出

  1. System.Windows.Application.Exit
  2. System.AppDomain.CurrentDomain.ProcessExit
  3. 终结者

WPF 应用程序:未处理的异常

  1. System.AppDomain.CurrentDomain.UnhandledException

在 TestDriven.NET 中运行的 MbUnit:通过测试(优雅退出)

  1. System.AppDomain.CurrentDomain.DomainUnload
  2. 终结者

MbUnit 在 TestDriven.NET 中运行:测试失败(未处理的异常由 MbUnit 处理)

  1. AppDomain.CurrentDomain.DomainUnload
  2. 终结者

问题:

  • 我的解释/发现是否正确?
  • 你知道我遗漏的更多细节吗?例如,终结器的总执行时间是多少?
  • 你知道我知道的任何其他事件/想法吗?
  • 有哪些事件,它们在其他应用程序(例如 Windows 窗体、Web 服务、ASP.NET 网站等)中引发的顺序是什么?
0 投票
3 回答
4815 浏览

.net - 我可以让默认 AppDomain 使用某些程序集的卷影副本吗?

我为什么要这样做的简短解释:

我正忙于为 Autodesk Revit Architecture 2010 编写插件。测试我的插件代码非常麻烦,因为我必须为每个调试会话重新启动 Autodesk,手动加载 Revit 项目,单击加载项选项卡,然后启动我的插件。这只是花费了太长时间。

我编写了第二个插件来托管 IronPython 解释器。这样,我可以使用 Revit 提供的 API。但最终,必须用 C# 重写代码并进行调试。

很简单,我想:只需从 IronPython 脚本加载插件 DLL 并运行它。这确实有效,但是一旦加载,我就无法在 Visual Studio 中重新编译,因为 DLL 现在已加载到 Revits AppDomain 中。

很简单,我想(在 StackOverflow 的帮助下):只需在新的 AppDomain 中加载 DLL。唉,RevitAPI 对象无法编组到另一个 AppDomain,因为它们不扩展MarshalByRefObject.

我想我可能会对影子副本有所了解。ASP.NET 似乎正在这样做。但是阅读 MSDN 上的文档,似乎我只能在创建AppDomain 时指定这一点。

我可以为当前(默认)AppDomain 更改此设置吗?我可以强制它使用来自特定目录的 DLL 的影子副本吗?

0 投票
3 回答
688 浏览

.net - 是否可以编写会触发 AppDomain.TypeResolve 事件的 C# 代码?

AppDomain.TypeResolve 在我眼里很神秘。有人可以提供触发此事件的示例代码吗?

谢谢。

0 投票
2 回答
988 浏览

asp.net - 如何加载 + 卸载 ASPNET 运行时,而不使用 bin 目录,用于自动化测试目的

我想加载 ASPNET 运行时,运行一个或多个页面,然后卸载它。这是出于测试目的。这不是 UI 测试;我真的只是在 ASPNET 上下文中测试库的使用。

通常这种事情是通过调用来完成的System.Web.Hosting.ApplicationHost.CreateApplicationHost

这就是我目前拥有的方式:

这是自定义 ASP.NET 主机:

这工作正常。但如果可能的话,我想避免创建 bin 目录,并将程序集复制到其中。

是否可以使用CreateApplicationHost,并告诉 ASPNET 从当前目录或任意目录加载程序集,而不是bin

编辑:: 稍微简化了代码。 EDIT2 :: 我查看了 womp 的答案,但似乎做了很多工作来避免一点。还有其他想法吗?

0 投票
3 回答
2130 浏览

c# - 为什么某些 .Net 程序集无法通过 AppDomain 的 GetAssemblies() 方法获得?

我有一些代码循环遍历当前加载到在 ASP.NET 应用程序中运行的 AppDomain 的类型。这是我获取程序集的方法:

当应用程序第一次启动时没有问题,并且我期望的所有类型都存在。但是,当我更新 Web.config 或终止 w3p.exe 进程(或该进程因任何原因被回收)时,只有我期望的某些类型可用。当我使用调试器单步执行时,我注意到私有搜索路径(我的应用程序的 bin 目录)中的某些程序集尚未加载。我假设所有程序集都在应用程序启动时加载并重新启动,无论它们是否立即需要。但是在重新启动的情况下,除非这些程序集文件已更新,否则这似乎不会发生。

我需要的是在启动时收集类型信息以供以后使用。但是由于在重新启动期间类型不可用,因此稍后需要使用类型信息时会产生严重破坏。那么考虑到这一点,我该如何解决或解决这个缺陷呢?

0 投票
3 回答
677 浏览

asp.net - 在 ASP.NET 应用程序中为初始启动计时

在 iisreset 或应用程序域回收后,我的 ASP.NET 应用程序需要很长时间才能加载第一个页面请求。

有没有办法可靠地测量应用程序域回收所需的时间?

0 投票
1 回答
14211 浏览

c# - AppDomain.CreateInstanceFromAndUnwrap - 无法投射透明代理

我正在编写一个 .NET 库来将托管 DLL 注入外部进程。我目前的做法是:

  1. 用于CreateRemoteThread强制目标进程调用LoadLibrary非托管引导 DLL。从这一点开始,我们正在目标进程中执行代码。
  2. 然后我的引导 DLL 创建 CLR 的一个实例并调用ExecuteInDefaultAppDomain它,它执行托管帮助 DLL 中的一个方法。
  3. 此方法创建一个新的 AppDomain 并调用AppDomain.CreateInstanceFromAndUnwrap以将执行传递到我的有效负载 DLL,将结果转换为IInjectionPayload.
  4. 这个想法是我的有效负载 DLL 公开了一个实现的类IInjectionPayload,因此帮助 DLL 可以简单地调用payload.Run()

我这样做是为了通过简单地调用AppDomain.Unload(在发出清理信号后)来完全卸载有效负载代码。

这种方法有效 - 我的有效负载 DLL 中的类正在目标进程中实例化,因此可以执行代码 - 但我不能将返回的对象CreateInstanceFromAndUnwrap转换为IInjectionPayload; 它抛出以下异常:

无法将透明代理转换为类型“blah.Blah.IInjectionPayload”。

我尝试过使用CreateInstanceAndUnwrap, 和Activator.CreateInstanceFrom后跟Object.Unwrap,但这两种方法也会导致抛出相同的异常。

我的有效载荷类的签名是:

public class Program : MarshalByRefObject, IInjectionPayload

我很困惑,因为有效负载 DLL 肯定会被加载,并且类正在按预期进行实例化。任何帮助将非常感激。

0 投票
2 回答
419 浏览

java - 在这种情况下,appdomains 是否可能会有所帮助?

我有一个 dotnet 进程,它通过对非托管 dll 的调用与 Java 进程进行通信。

在某些情况下,Java 进程似乎正在崩溃并导致我的 dotnet 进程崩溃。没有引发异常,该过程就死了。崩溃时,java 正在创建一个名称为“hs_err_pid3228”等的日志文件。

没有从提供非托管 dll 和 java 进程的供应商那里得到任何满意,我只好试图减轻问题,这需要确保调用 java 进程,如果它们崩溃,不要取消我的进程.

阅读了各种文章后,appdomains 似乎是一个可能使用的候选者 - 我的理论是我可以通过一些工作将调用 java 进程的功能分开并在单独的 appdomain 中运行它,如果没有捕获 appdomain,这将有望让我下降,至少检测到它已经发生并重新启动该功能。

有没有人遇到过类似的问题?对于那些有更多 appdomain 经验的人来说,这种方法是否合理?

为了让它更有趣,Java 崩溃并不是真正可重现的——它看起来很随机,我仍在与如何测试分离到 appdomain 中的方法作斗争

0 投票
1 回答
669 浏览

events - 控制台和 WPF 应用程序之间有什么区别吗?(事件跨 AppDomain)

我构建了一些程序集,其中之一是提供一些功能和一些事件。一些关系如下:

  • 程序集 A 是一个接口外观组件,它声明了所有服务接口。
  • 程序集 B 是声明程序集 A 的所有接口的一种“模拟”实现(包括事件)</li>
  • 程序集 C 是声明程序集 A 的所有接口的一个“真实”实现(包括事件)</li>

B 将负责在第二个 AppDomain 中创建 C 并在 C 中调用方法,如下所示: 在 B 程序集中:

而且,调用者应用程序将与程序集 B 交互,而不是直接与 C 交互。

现在,如果调用者应用程序是控制台类型,一切正常,但如果调用者应用程序是 WPF 类型,它会失败并报告“SampleForm.Window1 in ... 未标记为可序列化”(SampleForm.Window1 是 WPF 主窗口)。

这让我很困惑,谁能帮我解决这个问题?

谢谢,肯特