0

我创建了一个重大升级(Installscript msi),通过单击 exe 文件执行时运行完美。

我还在创建一个控制台应用程序,它运行相同的 exe,但这次安装后,连同新版本一起,以前的版本显示在添加/删除程序列表中。

所有组件都安装正确,但

为什么只有当我从控制台应用程序运行 exe 时才会显示以前的版本?

// Enter the executable to run, including the complete path
start.FileName = @"folder1\MyISProj.exe";
// Do you want to show a console window?
start.CreateNoWindow = true;
start.WindowStyle = ProcessWindowStyle.Minimized;

start.UseShellExecute = false;
start.RedirectStandardOutput = true;

// Run the external process & wait for it to finish
using (Process proc = Process.Start(start))
{
   //proc.WaitForExit();
    proc.Close();
}

我观察到的另一件事是,当我从控制台应用程序调用 exe 时,安装程​​序将打开并在接受 EULA 等之后,当实际安装开始时,控制台应用程序将再次被调用。为了阻止这种行为,我在 Main 方法中添加了一个检查,以仅运行一次控制台应用程序。现在,当安装程序再次尝试运行控制台应用程序时,它将检查进程是否已经在运行,如果是,它只是从控制台应用程序返回。

Process[] result = Process.GetProcesses();

foreach (var item in result)
{
    if (item.ProcessName.Contains("MyISProj"))
    {

        Console.WriteLine("There is already a instance running.");
        System.Environment.Exit(0);
        return;
    }

}

但在这样做之后,添加/删除程序列表也会显示两个条目。我必须做些什么来解决这个问题?我被这个问题困住了。

我正在使用InstallShield 2011 专业版来创建exe。

4

1 回答 1

0

这里有两个问题。首先是您没有有效的主要升级,这可以通过添加/删除程序中的两个条目来证明。您已更改 ProductCode,但升级表条目(由 FindRelatedProducts 和 RemoveExistingProducts 执行)未检测到先前的安装并将其作为升级的一部分删除。这有很多原因可以从谷歌搜索中找到。

第二个是 InstallScript MSI 静默安装在背后是一个皇家痛苦。它们要求您生成响应文件,然后使用它运行。这是非常脆弱的,也是我建议继续使用 Basic MSI 的一个重要原因,这是一个更简单的支持故事。( msiexec /I foo.msi /qn REBOOT=R 并检查 3010 退出代码,表明需要重新启动并被禁止。)

于 2013-07-22T14:03:14.110 回答