【问题标题】:How to determine if VSTO 2010 Runtime is Installed?如何确定是否安装了 VSTO 2010 Runtime?
【发布时间】:2015-09-01 18:13:52
【问题描述】:

只需使用产品代码 {388E4B09-3E71-4649-8921-F44A3A2954A7} 调用 MsiGetProductInfo() 即可轻松检查是否安装了 VSTO 2005 SE,如 listed in MSDN

VSTO 2010/4.0 运行时的产品代码是什么?或者有没有更好的方法来确定它是否已经安装?这是我们的安装过程。

另外,我正在尝试为Windows Imaging Component 找出相同的方法。

【问题讨论】:

    标签: installation vsto ms-office


    【解决方案1】:

    不幸的是,到目前为止,这里的答案并没有完全涵盖所有的基础。

    产品代码

    这似乎不可靠 - 我们正在寻找最低版本,而不是特定版本。虽然理论上产品代码只应该随着主要版本的增加而改变,但我机器上的 VSTO 版本 - 10.0.40303 - 的产品代码是 {A0FE0292-D3BE-3447-80F2-72E032A54875}。这表明微软不一定要保持它们稳定,所以我认为这不是一个好的选择。

    文件版本

    另一个选项可能是检查 VSTO 程序集本身的存在/版本,它通常位于 %PROGRAM FILES%\Common Files\Microsoft Shared\VSTO\10.0 中。但是我想说这个目录并不能保证 - 实际目录似乎是在注册表中指定的,但显然这个解决方案现在并不比直接从注册表中获取版本更好......

    注册表

    所以通过注册表可能是剩下的唯一选择。

    不幸的是,VSTO 运行时版本可以出现在 4 个注册表位置中的任何一个:

    • HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup\v4(32 位,从 Office 2010 安装的 VSTO)
    • HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup\v4R(32 位,从可再发行组件安装的 VSTO)
    • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4(64 位,从 Office 2010 安装的 VSTO)
    • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4R(64 位,从可再发行组件安装 VSTO)

    注意:我没有明确的来源 - 我正在拼凑来自 this blog post by Wouter van Vugtthis SO answer 的信息。可能还不止这些。

    此外,可能还有最低版本要求,但我怀疑实际上这只会影响运行 Office 2010 预发布版本的用户:

    Visual Studio 2010 Tools for Office 运行时还附带 Microsoft Office 2010。但是在 Office 2010 RTM 时, 带有 Office 的运行时仅支持针对 .NET 框架 3.5。如果您的解决方案针对 .NET Framework 3.5, 它可以在安装 Office 2010 或 Visual Studio 的情况下运行 安装了 Office 运行时可再发行组件的 2010 工具。如果你的 Office 解决方案面向 .NET Framework 4,您必须重新分发 Visual Studio 2010 Tools for Office 运行时 (citation)。

    【解决方案2】:

    最简单的方法是检查注册表。

    HKLM\Microsoft\vsto 运行时设置\v4\Install

    HKLM\Microsoft\vsto runtime setup\v4R\VSTORFeature_CLR40(这是用于 4.0 Office 扩展)

    【讨论】:

    • 那里的第二个答案(使用 VSTORFeature_CLR40)可能更正确。我刚刚遇到第一个注册表项 (HKLM\Microsoft\vsto runtime setup\v4\Install) 的情况,但我的插件无法加载 - 事实上 VSTO 没有安装。
    • 有人可以详细说明如何检测安装的 VSTOR40 是 x86 还是 x64?我已经安装了 x86 和 x64 运行时的所有组合,并且上面提到的键是唯一创建的键 - 一切都在 WOW6432Node 下 - 这意味着无法确定已安装运行时的“位数”......(请注意,Office 2010 有 32 位和 64 位两种版本,生成的 .net 进程将与 Office 安装具有相同的位数social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/…)
    • 我发现VSTORFeature_ 只存在于 x64 安装中。请在下面查看我对 x86 安装的回答。
    【解决方案3】:

    最安全最干净的方法还是检查产品代码,这里是:

    对于 VSTO 2010 x86,版本 10.0.31124:{41A01180-D9FD-3428-9FD6-749F4C637CBF}

    对于 VSTO 2010 x64,版本 10.0.31124:{C3600AE6-93A0-3DB7-B7AA-45BD58F133B5}

    我通过使用 7-Zip 提取以下软件包的内容并使用 Orca 分析 MSI 得到它们:

    http://download.microsoft.com/download/F/3/9/F395E3C2-28A0-4F0D-9E20-FF4D1ADB08D8/vstor40_x86.exe

    http://download.microsoft.com/download/F/3/9/F395E3C2-28A0-4F0D-9E20-FF4D1ADB08D8/vstor40_x64.exe

    【讨论】:

      【解决方案4】:

      它们的密钥因您要安装到的操作系统而异。我煞费苦心地在 x86 和 x64 中安装了独立的 vsto 和 office 2010 和 2013 .exe。 为了使用注册表检查是否安装了 vsto,您需要验证以下键是否存在:

      对于 x64:

      • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4 -> 安装

      • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4 -> ProductCode

      对于 x86:

      • HKLM\SOFTWARE\Microsoft\VSTO 运行时设置 -> InstallerPath

      编辑:我实际上最终做的是验证v4 文件夹是否存在。

      【讨论】:

        【解决方案5】:

        在 SCCM 2012 中将 Vstor 部署为应用程序时,我需要一种检测方法。我使用以下 PowerShell 脚本从 WMI 检索信息。

        如果版本是 10.0.50908,则生成输出。如果检测脚本返回任何值,SCCM 就认为检测成功。

        $VstorVersion = Get-WmiObject -Query "select ProductVersion from SMS_InstalledSoftware where ARPDisplayName = 'Microsoft Visual Studio 2010 Tools for Office Runtime (x64)'" -NameSpace "root\cimv2\sms"
        if ($VstorVersion.ProductVersion -ge '10.0.50908') {Write-Host "Found"}
        

        【讨论】:

          【解决方案6】:

          这里是代码。 在公共方法中,我们确定是从 Office 或 VSTO 运行时包安装的 VSTO。 在私有方法中,检查版本是否等于或大于版本 VSTO2010

          public static bool CheckVSTO2010 ( ) {
                  string regFragment = IntPtr.Size == 8 ? "\\Wow6432Node\\" : "\\";
                  string regVSTO = string.Format( @"SOFTWARE{0}Microsoft\VSTO Runtime Setup\", regFragment );
                  return CheckVSTOVersion( regVSTO + "v4\\" ) || CheckVSTOVersion( regVSTO + "v4R\\" );
              }
          
          
              private static bool CheckVSTOVersion ( string keyPath ) {
                  using (var key = Registry.LocalMachine.OpenSubKey( keyPath )) {
                      //Not installed
                      if (key == null) {
                          return false;
                      }
                      var releaseKey = key.GetValue( "Version" );
                      if (releaseKey != null && !string.IsNullOrEmpty( releaseKey.ToString() )) {
                          var version = new Version( releaseKey.ToString() );
                          return version.Major >= 10 && version.Build >= 40820;
                      }
                  }
                  return false;
              }

          【讨论】:

          • 虽然代码很受欢迎,但它应该总是有一个附带的解释。这不必很长,但在意料之中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          • 2013-11-02
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          相关资源
          最近更新 更多