【问题标题】:Creating Automatic application updater in C#在 C# 中创建自动应用程序更新程序
【发布时间】:2012-02-15 07:32:01
【问题描述】:

我有一个 Windows 应用程序(可以说它是“App A”),其中包含一些 Windows 服务和一个窗口窗体。

现在我正在创建另一个包含 Windows 服务的应用程序(将其命名为“App B”)。这将在我的服务器上检查是否有更新版本的“App A”可用。如果有更新的版本可用,它将

下载新版本 --> 卸载“App A” --> 安装新版本

对于卸载,我正在使用此代码:

private void uninstall()
    {
        Process p = new Process();
        p.StartInfo.FileName = "C:\\WINDOWS\\system32\\msiexec.exe";
        p.StartInfo.Arguments = "/x \"c:\\AppA.msi\" /qn";
        p.Start();
        p.WaitForExit();
    }

为了安装,我使用这个代码:

private void install()
    {
        Process p = new Process();
        p.StartInfo.FileName = "C:\\WINDOWS\\system32\\msiexec.exe";
        p.StartInfo.Arguments = "/i \"c:\\AppA.msi\" /qn";
        p.Start();
        p.WaitForExit();
    }

但此代码不起作用,应用程序未卸载。

如果我做错了什么,请告诉我。真的很紧急。

【问题讨论】:

  • 我想一种解决方案可能是使用动态绑定/反射,如果我没记错的话,您可以使用它动态绑定您的程序集......
  • 除了“不工作”之外,您是否获得了更多信息:任何错误消息、日志等?
  • 为什么您的数据包名称是 c:\\AppA.msi\ 而不是 c:\\AppA.msi ? (目录或文件)
  • 我的问题与 Lonli 相同,当我使用 GUID 进行 MSI 卸载时,/x 和文件|uid 之间通常没有空格:MSIEXEC.exe /q /norestart /x "C:\myapp.msi"
  • @Lonli-Lokli 我认为这只是一个转义的 " 字符。

标签: c# winforms windows-services auto-update


【解决方案1】:

为了帮助解决为什么会发生这种情况,我会做两件事,首先将卸载代码更改为:

private void uninstall()
{
    Process p = new Process();
        p.StartInfo.FileName = @"C:\WINDOWS\system32\msiexec.exe";
        p.StartInfo.Arguments = @"C:\Windows\System32\MSIEXEC.EXE /l* ""AppAUninstall.log"" /q /norestart /x""C:\MyApp.msi""";
        p.Start();
        p.WaitForExit();
}

此代码将留下一个名为 AppAUninstall.log 的文件,该文件将告诉您 msi 卸载的输出,这可能包含有关其未卸载原因的信息

另外,你有安静的参数,/q,在那里。大多数情况下,MSI 在运行时需要在 windows vista 及更高版本上使用 UAC 提升,因此如果您的更新程序应用程序没有以管理员身份运行,那么这将悄悄地失败。

马丁

【讨论】:

  • 你能告诉我这个“AppAUninstall.log”将在哪里创建吗?
  • 它应该在您的应用程序目录中。如果找不到,可以使用:@"C:\Windows\System32\MSIEXEC.EXE /l* ""c:\AppAUninstall.log"" /q /norestart /x""C:\MyApp.msi """;这将把它放在C盘的根目录
  • 我尝试了这种方法,但这不起作用,因为我在 Windows 服务中运行此代码,并且当服务在任何服务器上运行并且没有人登录时,这些类型的操作将不起作用。因为对于安装和灌输,我们需要拥有这些权限的用户权限。
  • 如果服务以 SYSTEM 身份运行,那么它将拥有最高权限,并且应该能够在无需用户输入的情况下卸载。
  • 但它实际上并没有这样做..这就是为什么我假设这个......它只是开始了这个过程,但什么也没做。如果您知道解决方案,请帮助我...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2010-09-08
相关资源
最近更新 更多