在冷启动时更快地加载插件

4
我们正在为Microsoft Word (2007 & 2010)创建一个插件。当我们在冷启动状态下启动我们的插件时,即机器被关闭并重新启动时,我们遇到了延迟问题。然后,Word的第一次启动需要大约30-35秒。随后的启动会更快。
我们认为这可能是由于从磁盘加载VSTO和.NET dlls到内存中的延迟所致。为了测试这一点,我们创建了一个空的Word插件,其中不包含任何代码。在冷启动状态下,只有加载了这个插件,Word需要大约17秒才能启动。
我们是否可以通过某种方式加快这个过程?如果有任何技术可以使VSTO和.NET dlls加载更快,将不胜感激。

你的插件有很多外部依赖吗?有很多代码正在运行,可以放在后台线程上吗? - Rowland Shaw
2个回答

2
为了测试这个,我们创建了一个虚拟的Word插件,其中没有任何代码。
这并不是你的理论的有效测试。即使是一个完全没有代码的插件,也需要加载.NET Framework支持DLL。
当您添加了您实际插件的其他依赖项时,这就解释了为什么需要双倍的加载时间(从17秒增加到35秒)。
这是.NET解决方案已知的“问题”——如果.NET运行时环境尚未被加载,它们在第一次启动时相对较慢。随后的启动时间要快得多。
除了在程序集上运行NGEN之外,实际上并没有太多可以做的事情。这可能会稍微有所帮助,但它还有其他后果,因此我不建议将其作为简单的事情。我的建议只是要习惯缓慢的冷启动或切换到其他技术。

是的,我们的启动代码确实很多。我们正在尝试找到加速它的技巧。我的观点是如何让这 17 秒只是加载 .NET dlls 的时间消失。也许创建一个虚拟 .net 应用程序并将其放在启动中。但这似乎只是将注意力从我们的插件转移开来,有些人可能会称之为邪恶。 :) - Mayank
1
@Mayank 这就是问题所在,你无法做到。在使用 .NET Framework 之前必须先加载它。这在冷启动时需要一些时间,但只需要发生一次。这不是你可以“修复”的事情。如果这对你的使用不可接受,你需要切换技术。是的,在启动时运行一个虚拟应用程序是邪恶的定义。 - Cody Gray
感谢澄清。我们目前无法更换技术,所以我想我们只能忍受这种延迟(或者变得邪恶)。 - Mayank

2
有2个注册表键可以影响插件的加载时间:LoadBehaviorWarmup。在这里了解它们。
将LoadBehavior设置为9(按需加载),这样您的插件将在第一次使用时加载,而不是在Word启动时加载,从而减少Word的启动时间。
设置Warmup为1可能有所帮助。这会导致.NET框架和VSTO运行时在您的插件之前加载,以“减少加载插件的感知时间”。 (就我个人而言,我不确定这会产生多大的影响。我的插件加载非常快,因此我没有从使用此设置中看到提升。)
总体而言,您的插件加载时间如此之长很奇怪。建议仔细查看加载插件时运行的代码(构造函数、Load事件等)。

更改LoadBehavior时要小心!最近,当使用“按需加载”时,我的插件已经停止工作。将其更改回“在启动时加载”可以解决问题。我不确定这是否是由于最近的Office更新引起的。 - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接