多年来,我一直使用 x-copy 部署我的 .NET 程序集,没有任何问题。从上周开始,我们有一个小团队负责构建一个包含 .NET 程序集和 exe 以及 c++ 遗留 exe 和 dll(超过 200 个文件)的设置。第一次安装后,我的 wpf 应用程序有一个问题:启动时间非常长。我已经使用 procmon 分析了我的一个 wpf 应用程序(ps:.NET 程序集是 GACed 和 NGened),并且我看到该过程对所有其他不相关(> 200)文件进行了多次操作(见附件截图),我认为这是应用程序启动时间缓慢的主要原因。这与 .NET 发布者政策有关吗?如何禁用此行为以使我的应用程序再次快速?提前致谢!
1 回答
这组跟踪似乎与基于“广告”COM 类的 COM 实例化有关。如果不知道您的 MSI 是如何组织成功能、组件和 COM 注册的,就很难完全确定。
但无论如何,如果 COM 类是使用 MSI 文件中的 Class 表注册的,那么它们就有一个称为 Darwin 描述符的 InprocServer32 注册表值(不是键)。它通过功能名称、产品代码和组件代码引用 COM 实例化的目标,这可能就是您在注册表中看到对 Windows Installer 功能和组件键的引用的原因。通常会使用该描述符调用 MsiProvideComponent,从而进行弹性检查并在有任何损坏时进行修复。
你没有说你正在使用什么工具,但如果你有很多 COM 注册并且所有这些都是通过在 MSIs 类表中的注册进行宣传的,这可能是问题所在。在不知道您使用什么工具来构建 MSI 并查看 MSI 文件的情况下,很难确定。但是,例如,WiX 允许您使用 Class 表进行注册,但使用 Advertise=no,这会导致使用注册表项完成注册,这是创建 COM 注册同时避免广告/弹性检查的另一种相当明显的方法。
此外,也许最重要的是,您需要确保您的产品安装实际上不会在启动时自行修复 - 这会大大减慢它的速度!例如,如果任何文件或注册表项在安装后被删除,则可能会启动修复。在应用程序事件日志中查找有关缺少组件的 MsiInstaller 事件日志条目。