C# 有没有合适的方法来检查机器上是否安装了特定的Microsoft应用程序?

C# 有没有合适的方法来检查机器上是否安装了特定的Microsoft应用程序?,c#,.net,windows,C#,.net,Windows,考虑以下场景-- 假设您正在编写一个需要使用特定Windows应用程序的应用程序。具体来说,它是一个安装各种API工具的应用程序,旨在将应用程序集成到其他一些Microsoft软件或服务中 现在,让我们做几个其他假设,如下所示: 您的应用程序不关心安装了该工具的哪个版本,因为版本更改往往只是修复错误的小更新,或者是让组件正确安装在不同版本的Windows上的补丁 您正在编写一个国际工具,因此您需要的Microsoft组件工具有可能安装在您的最终用户计算机上,但它可以用非英语名称安装 此外,您的

考虑以下场景--

假设您正在编写一个需要使用特定Windows应用程序的应用程序。具体来说,它是一个安装各种API工具的应用程序,旨在将应用程序集成到其他一些Microsoft软件或服务中

现在,让我们做几个其他假设,如下所示:

  • 您的应用程序不关心安装了该工具的哪个版本,因为版本更改往往只是修复错误的小更新,或者是让组件正确安装在不同版本的Windows上的补丁
  • 您正在编写一个国际工具,因此您需要的Microsoft组件工具有可能安装在您的最终用户计算机上,但它可以用非英语名称安装
  • 此外,您的应用程序分布在一个zip文件中您的用户没有安装您的软件,因此您无法创建安装程序附加功能。相反,您必须运行应用程序,然后检查是否已安装所需的Microsoft工具
使用C#,是否有一种标准化的方法来检查应用程序是否已安装。具体地说,是否存在某些WMI调用或注册表查询,执行该查询时会返回某种形式的唯一标识符,该标识符旨在表示唯一表示已安装应用程序的值,而不管应用程序的安装名称或版本如何

我能找到的关于检查已安装软件的所有问题,或网络上的其他地方,都建议通过查找名称来检查软件是否已安装。这是可行的,但是,我们的软件是一个全球工具,用于具有不同文化背景的机器上。我们发现,即使在我们提供安装文件之后,这种简单的检查也不起作用,因为Microsoft安装程序中的本地化设置正在为不同的非英语语言环境设置的计算机上重命名应用程序

这个问题是否有一个“形式化”的解决方案?如中所述,假设您正在检查的特定工具的开发人员已正确设置其安装程序以正确配置这些ID值,是否有记录在案的方法来检查此类软件


顺便说一句,我们实际上有一些Microsoft工具需要检查。我不想包括一个列表,因为我希望有一种适度直接的方法来解决对多种不同工具的需求。

这里有两个相关的答案可以帮助您:

基本上,您需要了解两个GUID值:ProductCode和UpgradeCode

ProductCode标识所使用的确切安装包,并且对于每个版本应该完全不同(假设安装程序编程正确)

UpgradeCode标识整个产品本身,不应在版本之间更改(同样,假设安装程序编程正确)。这就是你需要寻找的


您可能需要检查的一件事是,开发人员是否对产品的不同语言版本使用了不同的升级代码。

您是否考虑过检查HKEY\U CLASSES\U ROOT中的注册表?我相信对于特定的类应该有一个唯一的CLSID。不过我可能错了。例如,在我的注册表中:
HKEY_CLASSES\u ROOT\Microsoft.PhotoAcquire\CLSID
的值为
{00f26e02-e9f2-4a9f-9fdd-5a962fb26a98}
@rory.ap。可能的问题是,我在任何地方都找不到一个确认,在同一应用程序的不同版本中,该值是否应该相同。我发现了一些看起来像它们可以工作的值,但是没有明确的文档说明这样的值可以(甚至应该)是一致的。我会认真考虑重新访问你的第一个假设。在当前发布的版本中,您知道您的代码可以安全地使用其中任何一个版本。但我会非常谨慎地断言,您的代码将在所有尚未编写的未来版本中安全运行。@Damien_,不信者,我通常理解,但这是一个非常小的、模糊的小工具,只不过是一个修补程序。问题是,一些用户可能会有一些小的变化,对于我们使用的一个特定工具,很难找到能够正常工作的版本(到目前为止基本上是所有版本),因为没有一个好的版本列表可以提供我们需要的所有细节。此外,我们的客户群有数百人。我们正在努力覆盖99%的案件。另外1%的人可以联系支持人员,我们可以亲自帮助他们。是的,ProductCode和UpgradeCode的名称似乎应该选择另一种方式。谁知道微软在想什么:)好吧,Foo1.0和Foo2.0企业版是两种不同的产品。但出于升级目的,Foo 2.0 EE安装程序应该能够找到Foo 1.0/1.1/1.2,而不需要所有适用产品的详尽列表。因此,名称确实有意义。ProductCode(稳定)和ReleaseCode/VersionCode(更改)将更有意义。典型的Microsoft.FYI,这可能就是答案。我患病毒性感冒和链球菌性咽喉炎已经有一段时间没有工作了。当我有机会进行实验并观察这些值时,我会的。非常感谢。