【发布时间】:2017-06-27 22:16:16
【问题描述】:
考虑以下场景--
假设您正在编写一个需要使用特定 Windows 应用程序的应用程序。具体来说,它是一个安装各种 API 工具的应用程序,旨在将应用程序集成到其他一些 Microsoft 软件或服务中。
现在,让我们做一些其他假设,如下所示:
- 您的应用程序并不关心安装了该工具的哪个版本,因为版本更改往往只是修复错误的小更新,或者是让组件正确安装在不同版本的 Windows 上的补丁。李>
- 您正在编写一个国际化工具,因此您需要的 Microsoft 组件工具有可能安装在您的最终用户计算机上,但它可以以非英文名称安装。
- 此外,您的应用程序分布在一个 zip 文件中。 您的用户没有安装您的软件,因此您无法创建安装程序。相反,您必须运行您的应用程序,然后检查是否已安装所需的 Microsoft 工具。
使用 C#,是否有一种标准化的方法来检查应用程序是否已安装。具体来说,是否有一些 WMI 调用或注册表查询在执行时返回某种形式的唯一标识符,该标识符旨在表示唯一代表已安装应用程序的值,而不管应用程序安装名称或版本如何? p>
关于 SO 或网络上其他地方的每个问题,我可以找到关于检查已安装软件的建议,建议通过按名称查找软件是否已安装。 这将工作,但是,我们的软件是一种全球性工具,可用于具有各种文化背景的机器。我们发现,即使在我们提供了安装文件之后,这种简单的检查也不起作用,因为 Microsoft 安装程序中的本地化设置正在重命名为不同的非英语语言环境设置的机器上的应用程序。
这个问题有“正式的”解决方案吗?例如,假设您要检查的特定工具的开发人员已正确设置他们的安装程序以正确配置这些 ID 值,是否有关于如何检查此类软件的记录方法?
顺便说一句,我们实际上有几个需要检查的 Microsoft 工具。我不想列出一个列表,因为我希望有一种比较直接的方法来解决对多种不同工具的需求。
【问题讨论】:
-
您是否考虑过检查 HKEY_CLASSES_ROOT 中的注册表?我相信一个特定的类应该有一个唯一的 CLSID。不过我可能是错的。例如,在我的注册表中:
HKEY_CLASSES_ROOT\Microsoft.PhotoAcquire\CLSID的值为{00f26e02-e9f2-4a9f-9fdd-5a962fb26a98}。 -
@rory.ap 可能,问题是我无法在任何地方找到确认,这是否应该在同一应用程序的不同版本之间可能是相同的值。我发现了几个看起来可以工作的值,但是没有明确的文档说明这样的值可以(甚至应该)是一致的。
-
我会认真考虑重新审视您的第一个假设。在当前发布的 版本中,您知道您的代码可以安全地使用它们中的任何一个。但我会非常谨慎地断言您的代码将安全地适用于所有尚未编写的未来版本。
-
@Damien_The_Unbeliever 我通常理解这一点,但这是一个非常小的、一种不起眼的小工具,只不过是一个修补程序。问题是一些用户可能会有细微的变化,对于我们使用的一个特定工具,很难找到可以正常工作的版本(到目前为止基本上是所有版本),因为没有一个好的版本列表可用包含我们需要的所有细节。此外,我们的客户群有数百人。我们正在努力覆盖 99% 的案例。剩下的 1% 可以联系支持人员,我们可以亲自帮助他们。