Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 记录并恢复.NET应用程序快速启动的应用程序状态_C#_.net_Windows_Winapi_Memory - Fatal编程技术网

C# 记录并恢复.NET应用程序快速启动的应用程序状态

C# 记录并恢复.NET应用程序快速启动的应用程序状态,c#,.net,windows,winapi,memory,C#,.net,Windows,Winapi,Memory,我正在使用一个开源的.NET应用程序,它需要很长时间才能启动和初始化。它可以创建数千个对象并配置它们以供首次使用。我正在努力改善这个启动时间 有没有办法使用Windows API或类似工具捕获应用程序内存,然后在重新启动电脑后快速“恢复”此状态?本质上,是否有一种方法可以访问和保存.NET应用程序的底层内存,并让CLR在以后“吸收”该内存 最简单的方法是使用Windows Hibernate创建“hiberfile.sys”,然后保存此文件的副本(如果可能的话)。每次windows启动时,您都

我正在使用一个开源的.NET应用程序,它需要很长时间才能启动和初始化。它可以创建数千个对象并配置它们以供首次使用。我正在努力改善这个启动时间

有没有办法使用Windows API或类似工具捕获应用程序内存,然后在重新启动电脑后快速“恢复”此状态?本质上,是否有一种方法可以访问和保存.NET应用程序的底层内存,并让CLR在以后“吸收”该内存

  • 最简单的方法是使用Windows Hibernate创建“hiberfile.sys”,然后保存此文件的副本(如果可能的话)。每次windows启动时,您都会用保存的“干净”版本覆盖现有的hiberfile,以便下次启动。这确保了您可以保存/恢复应用程序状态,而无需处理内存、指针和句柄。这行吗

  • 一种方法是创建一个mem磁盘,尽管我不知道恢复是否可行。(实际上可以脱离HDD工作的虚拟内存,允许将内存保存/恢复为简单文件)

  • 类似于问题,但有点不同,因为我不介意将应用程序内存重新插入到它保存的确切地址。电脑完全在我手中,为了简单起见,假设没有其他应用程序在运行

  • C不支持框外,尽管.NET 3和更高版本中的工作流基础允许工作流停止并重新启动。我想知道应用程序如何表现为工作流

  • 雷蒙德·陈(Raymond Chen)在一篇文章中对此提出了异议,但这里也没有太多的技术数据

  • ,一个开源进程监视器能够“显示/释放/更改保护/解除进程虚拟内存空间中的内存区域”。这可能和我想要的东西相似吗


如果您希望使用未更改的保存/加载过程来避免首次使用,您可以查看

实际上,保存内存是可能的,但是当您尝试恢复内存时,您会遇到寻址问题,并且您可能没有足够的内存,可能没有相同大小的可用块,等等

对象级别的序列化,甚至是一大组对象,将允许您以几乎与转储内存相同的方式保存它们及其状态,但会大大简化加载过程并使其更加可靠。Net提供了相当好的序列化支持,并且可以输出到二进制文件(小但依赖于版本)或XML(更大、可读性更强、更灵活)。其他库可能会提供更多不同用途的方法(我相信有一个JSON库,它稍微更详细一些,但适用于web应用程序)

根据应用程序的工作方式,您可能希望/能够在第一次运行时创建第一个使用模型,将它们序列化到磁盘,然后从那时起加载它们。通过一些工作,还可以将所有对象(不同类型)添加到单个集合并序列化,从而允许将所有数据存储在一个文件中


因此,是的,这是可能的,而且可能确实更快,尽管不是您最初的想法。

我认为您最好能做的是二进制序列化和反序列化Raymond Chen的文章提供了技术数据,包括一些非常重要的示例(系统的其余部分不会休眠,这可能会使所有外部句柄和资源无效)。如果内存被重新插入到它被释放的确切地址,会怎么样?类似于Windows休眠/还原?整个电脑都在我的控制下。这是非常困难的,如果不是不可能的话,要保证这一点。休眠在内核级别工作,所以除非你能强制内核在该块中永远不分配任何内存,否则请加载存储的内存数据,然后将其映射到进程虚拟内存映射中的特定地址,这是不会发生的。在.Net中,大部分或全部这是不可能的,甚至可能C/asm也不可能直接与WinAPI一起工作。在.Net世界中,序列化无疑是一种更正确的方法,并且可能会在以后省去很多麻烦(更简单、更安全)。可能性很小,但创建休眠文件的唯一方法是触发休眠,因此需要在Windows one之前运行一个引导加载程序来制作一个副本,然后交换休眠文件以供使用。篡改内核的引导过程不是解决序列化问题的好方法。不太难。假设我们引导到GRUB或可能触发此类代码的东西。
hiberfile.sys在启动windows后无法访问?我建议在下次重新启动时复制备份,以便在windows中运行的应用程序可以执行此操作。这可能吗?