如何使 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 发布工具创建。包被数字签名等
我尝试了多种选择:
- 在打开
.vsto
文件的过程完成之前不完成 Inno Setup 安装(带有 waituntilterminated
标志)。不起作用,似乎进程在打开 .vsto
文件期间发生了变化,VSTOInstaller
不是链中的第一个进程。因此,Inno Setup 只等待快速将执行传递给另一个进程 (VSTOInstaller
) 然后关闭的进程。
- 在安装时不删除提取的文件(带有
uninsneveruninstall
标志)。看起来它只适用于卸载,而在安装过程中删除临时文件有些不同。安装完成后,我没有找到任何方法来保持解压后的文件完好无损。
目前 .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.
}
}
我有 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 发布工具创建。包被数字签名等
我尝试了多种选择:
- 在打开
.vsto
文件的过程完成之前不完成 Inno Setup 安装(带有waituntilterminated
标志)。不起作用,似乎进程在打开.vsto
文件期间发生了变化,VSTOInstaller
不是链中的第一个进程。因此,Inno Setup 只等待快速将执行传递给另一个进程 (VSTOInstaller
) 然后关闭的进程。 - 在安装时不删除提取的文件(带有
uninsneveruninstall
标志)。看起来它只适用于卸载,而在安装过程中删除临时文件有些不同。安装完成后,我没有找到任何方法来保持解压后的文件完好无损。
目前 .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.
}
}