确定 ReportViewer 是否已安装的最佳方法

3
什么是查找报表查看器和WindowsInstaller-KB893803-v2-x86是否已安装在PC上的最佳方法?有没有办法找到要使用的公钥来查找某个程序是否已安装在PC上?(尝试过此方法,但无效) 确定.NET 3.5是否已安装的最佳方法 这是检查.NET 3.5是否已安装的方法,但是我想您需要另一个公钥来知道是否已安装报表查看器,但我不知道如何获得公钥。
我能想到的就是检查计算机上是否存在安装目录,这种方式是否可接受?

这是内置的报告工具吗?如果是,为什么需要知道它是否已安装?您可以将其dll与应用程序一起分发。一些所需的dll在GAC中,但您可以轻松地将它们取出。 - cjb110
是的,但我想防止该应用程序在计算机上安装自己,因为我正在使用它来安装另一个应用程序。因此最终我将在计算机上拥有两个应用程序,其中一个不做任何事情(仅在安装应用程序时使用)。 - Ruan
正如我所说,它们与SxS(并排部署)一起工作,因此您可以将它们全部放在应用程序旁边的文件夹中…无需安装。 - cjb110
哦,好的,我从来不知道那个。我会去了解一下,谢谢! - Ruan
4个回答

3

您可以检查 注册表

    public bool IsInstalled()
    {
        RegistryKey registryBase = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, string.Empty);
        if (registryBase != null)
        {
            return registryBase.OpenSubKey("Software\\Microsoft\\ReportViewer\\v2.0.50727") != null;
        }
        return false;
    }

2
在我的机器上(Win7和Server 2012),注册表键是不同的。
bool exist = false;
RegistryKey registryBase = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, string.Empty);
if (registryBase != null)
{
    exist = registryBase.OpenSubKey("Software\\Wow6432Node\\Microsoft\\.NETFramework\\v2.0.50727\\AssemblyFoldersEx\\ReportViewer v10") != null;
}

1

您还可以查询GAC以获取程序集,如此SO问题所示。


0

我对 MS Report Viewer 版本 10 的安装进行了 Regshot 差异比较,以查找密钥,因为这里发布的另外两个密钥均不起作用。

这是在全新的 Windows 服务器虚拟机上进行的实际差异结果

无论如何,我找到的此版本的密钥是:

SOFTWARE\Wow6432Node\Microsoft\ReportViewer\v10.0

我使用的代码:
public bool IsInstalledReportViewer()
{
    try
    {
        RegistryKey registryBase = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, string.Empty);
        if (registryBase != null)
        {
            // check the two possible reportviewer v10 registry keys
            return registryBase.OpenSubKey(@"Software\Microsoft\ReportViewer\v2.0.50727") != null
                || registryBase.OpenSubKey(@"Software\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\ReportViewer v10") != null
                || registryBase.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\ReportViewer\v10.0") != null;
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
        // put proper exception handling here
    }

    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接