如何使 Inno Setup 安装程序在安装完成后或 VSTO 安装程序完成后保留临时文件?

How to make Inno Setup installer keep temporary files either after installation completes or after VSTO installer completes?

我有 Inno Setup 安装程序(在我之前编写),它提取一组 VSTO 文件并开始安装 VSTO MS Office 插件。将 VSTO 文件提取到临时文件夹并启动 VSTOInstaller.exe 后,它会立即显示 Finish 按钮。如果用户单击它,则会删除临时文件并在 VSTOInstaller 中开始实际安装 VSTO 插件,然后导致 "file not found" 错误。我应该解决这个问题(理想情况下,Inno Setup 安装程序中的 Finish 按钮仅在其生成的 VSTOInstaller 完成执行时出现)。

VSTO 包本身("Application Files" 文件夹、setup.exe.vsto 文件的集合)由 Visual Studio 中的 ClickOnce 发布工具创建。包被数字签名等

我尝试了多种选择:

目前 .iss 文件看起来像:

;---------------------------------------------------------------------
[Setup]
AppName=Outlook Addin
AppVerName=Outlook Addin 2.0
DefaultDirName={tmp}
DefaultGroupName=Outlook Sync Addin
Compression=bzip
Uninstallable=no
OutputBaseFilename=OutlookSetup
VersionInfoVersion=2.0.0.10
UsePreviousAppDir=no
;
;---------------------------------------------------------------------
[Files]
Source: "SourcesForExe\*"; DestDir: "{app}"; Attribs: hidden system; Flags: recursesubdirs uninsneveruninstall
;---------------------------------------------------------------------
[Run]
Filename: "{app}\OutlookAddin.vsto"; Parameters: "OVERRIDE=YES"; StatusMsg: "Extracting Outlook Addin installer..."; Flags: shellexec waituntilterminated

最初,安装程序 运行 setup.exe 而不是 OutlookAddin.vsto。这导致 setup.exe 启动 VSTOInstaller.exe 并立即关闭。我认为更改为 OutlookAddin.vsto(并添加 shellexec 标志)可以解决这个问题,以便 VSTOInstaller.exe 可以通过这种方法直接启动,但它没有用。结果 .vsto 个文件首先被 vstoee.dll 打开。

知道如何保留解压缩的文件(它们将保留在临时文件夹中没什么大不了的)或以某种方式等待安装过程中产生的所有子进程吗?

如果这很重要,Inno Setup 是 5.2.3,VSTO 使用 Visual Studio 2015 构建。使用 Outlook 2010 和 2016 进行测试。

{tmp}是setup的临时文件夹,最后会被删除。如果要保留文件,请使用 TEMP 环境变量显式引用用户的临时文件夹:

DefaultDirName={%TEMP}\outlook_addin_tmp

不过,这是一个 hack – 正确的解决方案是等待 VSTO 安装程序完成。我建议您明确地启动 VSTOInstaller.exe。它应该允许您等待它完成

像这样:

Filename: "{commonpf}\microsoft shared\VSTO\<ver>\VSTOInstaller.exe"; \
  Params: "{app}\OutlookAddin.vsto"; \
  StatusMsg: "Extracting Outlook Addin installer..."; Flags: waituntilterminated

我最近按照你的要求创建了这个。 它对我来说工作正常,启动 setup.exe 然后搜索 VSTO 进程并将退出事件绑定到它。

            var process = Process.Start("Setup.exe");
            Thread.Sleep(2000);
            var processs = Process.GetProcesses().Where(i => i.ProcessName.Contains("VSTO")).ToList();
            foreach (var item in processs)
            {
                if (item.ProcessName.Contains("VSTO"))
                {                   
                    item.EnableRaisingEvents = true;
                    item.Exited += ExcelProcessExit; // this method will be executed after vsto completes it's installation or user cancels the installer.
                }
            }