【发布时间】:2012-03-27 07:19:30
【问题描述】:
我正在尝试创建一个安装程序,它会自动更新已安装的组件。 因此,我创建了一个安装程序项目,具有以下设置:
- 产品代码:{9835AE3C-1CED-4FC6-85E1-D2DC8093E9F4}
- 产品名称:Foo
- 升级代码:{02FD8E1A-A552-47AE-BDAA-F165702DE8DC}
- 版本:1.2.002
当我更改我的Version-attribute 时,会生成一个新的ProductCode(我的理解是,产品上的分组是通过UpgradeCode 完成的,具体版本绑定到ProductCode)。
我的自定义操作如下所示:
Sooo ...这里有我的安装程序类:
[RunInstaller(true)]
// my .cs-file
public partial class Installer : System.Configuration.Install.Installer
{
public Installer()
{
this.InitializeComponent();
}
protected override void OnAfterInstall(System.Collections.IDictionary savedState)
{
base.OnAfterInstall(savedState);
using (var serviceController = new ServiceController(Settings.Service.Name))
{
serviceController.Start();
serviceController.WaitForStatus(ServiceControllerStatus.Running);
}
}
protected override void OnBeforeUninstall(System.Collections.IDictionary savedState)
{
base.OnBeforeUninstall(savedState);
using (var serviceController = new ServiceController(Settings.Service.Name))
{
serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped);
}
}
}
// my designer
partial class Installer
{
private ServiceInstaller ServiceInstaller;
private ServiceProcessInstaller ServiceProcessInstaller;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.ServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
this.ServiceInstaller = new System.ServiceProcess.ServiceInstaller();
//
// ServiceProcessInstaller
//
this.ServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalService;
this.ServiceProcessInstaller.Password = null;
this.ServiceProcessInstaller.Username = null;
//
// ServiceInstaller
//
this.ServiceInstaller.ServiceName = "Foo";
this.ServiceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
}
#endregion
}
初始安装不是问题 - 一切正常(安装、自动启动,...)。但是,当我尝试使用相同的 UpgradeCode 但不同的 ProductCode 安装新的 .msi-package 时,安装程序会失败并显示“错误 1001:指定的服务已经存在”——这让我相信,任何卸载处理程序 (或调用)没有被调用并且UpgradeCode/Productcode-magic 不起作用...
所以,我的问题是:处理(或应该处理)卸载的路径(覆盖)在哪里?正确的实现是什么?
编辑:HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer:Logging 的设置是 iwemv - output @ pastebin (实际上我在我的场景中有不同的代码,就像我在这里的问题一样)。
正如我们在第 161ff 行看到的,找到了之前的版本:
MSI (c) (50:04) [10:03:31:319]: Doing action: AppSearch
Aktion gestartet um 10:03:31: AppSearch.
MSI (c) (50:04) [10:03:31:319]: Note: 1: 2262 2: AppSearch 3: -2147287038
Aktion beendet um 10:03:31: AppSearch. Rückgabewert 1.
MSI (c) (50:04) [10:03:31:319]: Doing action: FindRelatedProducts
Aktion gestartet um 10:03:31: FindRelatedProducts.
MSI (c) (50:04) [10:03:31:319]: PROPERTY CHANGE: Adding PREVIOUSVERSIONSINSTALLED property. Its value is '{C4C4318A-2F89-416B-A48C-76BD035EB52B}'.
Aktion beendet um 10:03:31: FindRelatedProducts. Rückgabewert 1.
第 272 行调用@客户端
MSI (c) (50:04) [10:03:31:413]: Switching to server: TARGETDIR="C:\Program Files (x86)\MyCompany\Foobar\" ALLUSERS="1" PREVIOUSVERSIONSINSTALLED="{C4C4318A-2F89-416B-A48C-76BD035EB52B}" VSDNETURLMSG="Dieses Setup erfordert die Version 4.0 von .NET Framework. Installieren Sie .NET Framework, und führen Sie Setup erneut aus. .NET Framework kann über das Internet bezogen werden. Möchten Sie es jetzt beziehen?" VSDNETMSG="Dieses Setup erfordert die Version 4.0 von .NET Framework. Installieren Sie .NET Framework, und führen Sie Setup erneut aus." CURRENTDIRECTORY="D:\Foo\Release" CLIENTUILEVEL="0" CLIENTPROCESSID="5200" USERNAME="MyCompany Support" COMPANYNAME="MyCompany GmbH" SOURCEDIR="D:\Foo\Release\" ACTION="INSTALL" EXECUTEACTION="INSTALL" ROOTDRIVE="D:\" INSTALLLEVEL="1" SECONDSEQUENCE="1" ADDLOCAL=DefaultFeature
第 313 行调用@服务器
MSI (s) (A4:6C) [10:03:41:219]: Command Line: TARGETDIR=C:\Program Files (x86)\MyCompany\Foobar\ ALLUSERS=1 PREVIOUSVERSIONSINSTALLED={C4C4318A-2F89-416B-A48C-76BD035EB52B} VSDNETURLMSG=Dieses Setup erfordert die Version 4.0 von .NET Framework. Installieren Sie .NET Framework, und führen Sie Setup erneut aus. .NET Framework kann über das Internet bezogen werden. Möchten Sie es jetzt beziehen? VSDNETMSG=Dieses Setup erfordert die Version 4.0 von .NET Framework. Installieren Sie .NET Framework, und führen Sie Setup erneut aus. CURRENTDIRECTORY=D:\Foo\Release CLIENTUILEVEL=0 CLIENTPROCESSID=5200 USERNAME=MyCompany Support COMPANYNAME=MyCompany GmbH SOURCEDIR=D:\Foo\Release\ ACTION=INSTALL EXECUTEACTION=INSTALL ROOTDRIVE=D:\ INSTALLLEVEL=1 SECONDSEQUENCE=1 ADDLOCAL=DefaultFeature ACTION=INSTALL
sooo ...操作是安装,而不是更新/卸载/...?!
【问题讨论】:
-
如果您有相同的升级代码和较新的版本,升级应该触发旧版本的卸载。例如,如果应用程序具有不同的安装类型,即第一个是按用户安装的,而第二个是按机器安装的,或者相反,则操作系统会跳过升级。您应该创建一个详细日志以查看实际发生的情况:support.microsoft.com/kb/223300
-
@BogdanMitrache 感谢您的提示 - 我已经包含了一个“审查”输出@pastebin (pastebin.com/CnXXgeJT)