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