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

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

问题描述:

我有一个使用Visual Studio的安装和部署创建的安装程序,它通常非常好。以编程方式获取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?

注:我理解微软建议通过Add/Remove Programs(XP)或Programs and Features(Vista/7的)去,但我的应用程序在生产环境中,大多数PC具有这些特征去除去(使用tweak或一些不同的工具)由我们的网络管理员。

+1

尝试使用MsiEnumProducts列出系统上的所有产品。或者,如果您知道升级代码(不会从构建到构建),您可以识别系统上共享该升级代码的所有其他产品,希望不多。http://www.pinvoke.net/default.aspx /msi/MsiEnumRelatedProducts.html – 2011-04-12 20:09:34

通过Ben在SO文章In a Visual Studio setup project, How do I generate an uninstall script?得到了我所需要的。

总结如下:

“使用Visual Studio 2005/2008,你不需要编写任何代码添加卸载选项安装项目(是的,我知道有些人可以编写代码做它)

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

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

条件:=未安装(确保你把“未安装”完全一样,同样的情况下,一切),永久:= True时,系统:=真,传递:=真,重要:=假。

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

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

在“未安装”条件和Permananet:=真确保MSIEXEC.EXE仅放置到系统文件夹为一体的部分安装,如果它不存在AREADY,并且它不被除去上一个卸载 - 因此它是非常安全的忽略这个警告,只是去为它。

MSI Install Fails because "Another version of this product is already installed"有一个VBS片段,您可能会发现它可以用作模型。

+0

我开始考虑使用一次WiX,但当时我没有时间理解这一切。也许每当我有时间.... :) – jp2code 2011-04-14 13:17:34

+0

我给了+1,但我没有接受这个答案。 Visual Studio *应该*有一种方法让项目在同一解决方案中查看其他项目并阅读一些GUI值。 – jp2code 2011-04-14 13:20:14