2012-07-25 57 views
2

我想检查系统中是否已安装特定文件。使用C#验证已安装的应用程序

我想检查这个特定的vcredist_x86.exe是否已经安装在机器上,如果没有安装它。

下面的代码是我的方法,任何人都可以告诉我我在做什么是对的或错的。

public Form1(bool isSilent, bool isXmlConfig) 
{ 
    this.isSilent = isSilent; 
    this.isXmlConfig = isXmlConfig; 

    x86 = !Environment.Is64BitOperatingSystem; 

    string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(regKey)) 
    { 
     if (key != null && key.GetSubKeyNames().Any(keyName => key.OpenSubKey(keyName).GetValue("DisplayName") == "My App's Display Name")) 
      Process.Start("vcredist_x86.exe"); 
    } 

    MyExtract(); 

    if (!isSilent) 
     Visible = ShowInTaskbar = false; 
} 

private void MyExtract() 
{ 
    string zipToUnpack = @"N:\Tools\DATABASE\CACHE"; 
    string unpackDirectory = @"N:\Tools\DATABASE\CACHE\OUTPUT\"; 
    using (ZipFile zip1 = ZipFile.Read(zipToUnpack)) 
    { 
     // here, we extract every entry, but we could extract conditionally 
     // based on entry name, size, date, checkbox status, etc. 
     foreach (ZipEntry e in zip1) 
     { 
      e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently); 
     } 
    } 
    Process.Start(unpackDirectory); 
} 
+1

你得到一个错误?它是做你期望的吗?它做错了什么? – 2012-07-25 13:20:03

+0

他在问他的方法是否正确。代码*可能*适用于他。 – Ruel 2012-07-25 13:21:26

+0

@ Alex Mendez:我没有收到任何错误,因为我没有测试过它。我想在这里做什么,我想检查特定的.exe是否已经安装,如果没有,然后安装它。 – linguini 2012-07-25 13:24:30

回答

4

我认为你的方法似乎没问题。但是,您需要匹配正确的应用程序名称。您应该使用类似"Microsoft Visual C++ 2008 Redistributable"或该可再发行组件的特定名称,而不是使用"My App's Display Name"。另外,CACHE似乎是一个不是文件的文件夹。您将需要提供一个压缩文件来提取。

你应该有这个代替:

bool isRedistributableFound = false; 
string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
using (Microsoft.Win32.RegistryKey uninstallKey = Registry.LocalMachine.OpenSubKey(regKey)) 
{ 
    if (uninstallKey != null) 
    { 
     string[] productKeys = uninstallKey.GetSubKeyNames(); 
     foreach (var keyName in productKeys) 
     { 
      RegistryKey productKey = uninstallKey.OpenSubKey(keyName); 
      if (productKey != null) 
      { 
       isRedistributableFound = productKey.GetValue("DisplayName") == "Microsoft Visual C++ 2008 Redistributable"; 
       if (isRedistributableFound) 
        break; 
      } 
     } 
    } 
} 

if (!isRedistributableFound) 
    Process.Start("vcredist_x86.exe"); 
1

假设MyExtract()不管是否存在注册表项运行安装程序(我不知道什么是你拆包zip文件,所以很难判断)您当前正在运行它。

考虑一下:

string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(regKey)) 
{ 
    if (key != null && key.GetSubKeyNames().Any(keyName => key.OpenSubKey(keyName).GetValue("DisplayName") == "My App's Display Name")) 
    { // brackets added for readability 
     Process.Start("vcredist_x86.exe"); 
    } 
    else 
    { 
     MyExtract(); 
    } 
} 

你提取难追不知道有问题的zip文件的确切结构 - 当你说Process.Start([directoryName])我会期待它只是打开Windows资源管理与目录。如果你想运行一个MSI包或类似的压缩文件,那么你将需要找到这个包并运行它,并关闭你的应用程序,并要求用户在安装完成后重新启动(有点麻烦),或者注意安装程序,并在完成后唤醒应用程序。

当然,如果您的应用程序将此作为先决条件并需要自行安装,则最好将它们绑定到Wix包中,以便您不必在自己的代码中担心它。

相关问题