.net - 自定义 CLR 主机 - "Pause"/"Resume"应用程序

标签 .net clr clr-hosting

我最近一直在研究暂停和恢复 .Net 应用程序的能力,特别是着眼于能够暂停应用程序、存储其状态并稍后再次启动它。

我一直在研究通过编写自定义 CLR 主机提供的选项,这无疑是一门神秘的艺术。看来自定义主机可以提供自己的任务、内存管理、锁等实现。因此,从这里看来,我也许能够创建一个自定义 CLR 主机,它可以通过 ICLRTask 暂停和恢复应用程序,但我'我不确定提供的接口(interface)是否有足够的钩子(Hook)来暂停所有任务,将整个程序状态存储到磁盘,然后稍后使应用程序恢复正常。有人能明确地告诉我这根本不可能吗?我也不介意它是否只适用于一小部分应用程序,我只是对这里的可能性感到好奇。

最佳答案

很抱歉让你的游行受到影响,但这不会成功。 ICLRTask 接口(interface)是根据 SQL Server 团队的明确请求添加的。它们支持 SQLCLR 主机,这是 CLR 的自定义主机,允许程序员在存储过程中编写托管代码。他们要求 CLR 团队打破托管线程和操作系统线程(当前框架中的 ProcessThread)之间的硬链接(hard link)。旨在将托管线程实现为纤程,这是当时 SQL Server 的核心功能。

这实际上并没有发生,他们无法获得足够可靠的结果并放弃了该项目。而且该项目很快就失去了使其工作的理由,光纤无法与具有自己的 L1 缓存的多核 cpu 相比。

这与您想要完成的任务没有太大关系。到目前为止,除了可靠地捕获进程状态之外,最难解决的问题是您无法真正处理正在执行 native 代码的线程。特别是调用 winapi 函数并阻塞内核驱动程序以完成 I/O 请求的类型。你无法捕获内核状态,也没有钩子(Hook)。向 pinvoke 编码器添加钩子(Hook)会使其变得太慢。 Hibernate是一个系统功能,它不可能是一个进程功能。

关于.net - 自定义 CLR 主机 - "Pause"/"Resume"应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769364/

相关文章:

c - 是否可以在 C 程序中承载 CLR?

.net - 不同类型的用户控件的 WPF 列表

.net - 可以从 PERL 的 .NET 中创建的 DLL 调用方法吗?

.net - .NET CLR 上长时间运行的模拟应用程序

c# - System.Math.Abs​​() 调用 native 方法 System.AppDomain.GetId()?

c# - C# 和非托管 native C++ 是否有一种通用方法来确定已安装的 CLR 版本?

c# - SQL 插入 : Duplicate Key Value Specified?

.net - 将 MSChart 上的标记设置为特定的 X 值

.net - 如何将 CLR 2 应用程序作为 CLR 4 应用程序运行

c# - 自定义 AppDomainManager 启动 runtimeHost 失败