以编程方式获取应用程序的Visual Studio安装项目产品代码

时间:2011-04-07 17:30:19

标签: c# visual-studio windows-installer

我有一个使用Visual Studio的设置和部署创建的安装程序,通常做得很好。

我的一个版本不时有缺陷,我需要一种方法来快速扭转我的决定,进行神话般的升级。

我可以通过包含一个继承自System.Configuration.Installer的自定义类来创建一个链接,或者在我的应用程序中创建一个选项来卸载它,以便我可以使用以下内容重新安装旧版本:

//using System.Diagnostics;
public static void Uninstall(string productCode, string option) {
  if (!String.IsNullOrEmpty(productCode) && !String.IsNullOrEmpty(option)) {
    string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
    string param1 = string.Format("{0} {1}", path, @"\msiexec.exe");
    string param2 = string.Format("{0} {1}", option, productCode);
    ProcessStartInfo psInfo = new ProcessStartInfo(param1, param2);
    // NOTE: `option` = /i to repair or remove; /x to remove only
    try {
      Process.Start(psInfo);
      return;
    } catch (Exception) { } // the uninstall failed
  }
}

因此...

我的问题:如何获取我的安装的ProductCode?

注意:我了解Microsoft建议通过Add/Remove Programs(XP)或Programs and Features(Vista / 7),但我的应用程序正在制造环境中,大多数PC都删除了这些功能(使用我们的网络管理员可以使用tweak或其他各种工具。

2 个答案:

答案 0 :(得分:1)

MSI Install Fails because "Another version of this product is already installed"有一个VBS片段,您可能会觉得它很有用。

答案 1 :(得分:1)

Ben在SO文章In a Visual Studio setup project, How do I generate an uninstall script?中的回答让我得到了我需要的内容。

总结:

  

“使用Visual Studio 2005/2008,您不需要编写任何代码来为安装项目添加卸载选项(是的,我知道有些人可以编写代码来执行此操作)

     
      
  • 在安装项目中 - >文件系统窗口 - >右键单击“目标机器上的文件系统” - >添加特殊文件夹,选择系统文件夹;

  •   
  • 进入此系统文件夹添加文件。从本地System32文件夹中浏览msiexec.exe并添加它。覆盖此文件的默认属性,如下所示:

  •   
     

条件:=未安装(请确保将'未安装'完全相同,相同的情况和所有内容),Permanent:= True,System:= True,Transitive:= True,Vital:= False。

     
      
  • 在“用户程序菜单”下创建一个新快捷方式,将目标设置为您在步骤1中创建的系统文件夹,并将其指向msiexec.exe。将快捷方式重命名为“卸载应用程序”。将Arguments属性设置为/ x {space} [ProductCode]。

  •   
  • 构建项目,忽略有关应排除msiexec,不要排除它或安装项目不会构建的事实的警告。

  •   
     

“未安装”条件和Permananet:= True确保msiexec.exe仅作为安装的一部分放入系统文件夹中,如果它不存在,并且在卸载时不会删除它 - 因此它是非常安全的,可以忽略那个警告而只是去做吧。