如何制作一个简单包装EXE文件的MSI

Jos*_*hua 33 installer windows-installer msiexec

经过太多的实验,我得出结论,Windows Installer简直就是糟糕的技术.但客户需要MSI文件.

那么,我如何创建一个MSI文件,将EXE文件提取到临时目录并使用与传递给EXE文件相同或相似的选项运行它?

Msiexec(命令行选项)中解释了MSI的选项(MSI的低级"运行"是msiexec选项package.msi).

编辑:mjmarsh的WiX解决方案看起来很有效.我还没有机会尝试它(关键时刻).如果它有效,我会接受它.

编辑:它不起作用.遗失的部分:有人/无人看管似乎没有.

无论如何,唯一能完成这项工作的是自定义动作来杀死它的父进程!

编辑:所以有人发布了一个进一步的答案包装整个事情作为安装后的自定义操作.理论上可行,但由于可能需要重新启动(感谢MS for .NET 4有时需要重新启动),我们必须做进一步的hackery.所以从优势矩阵:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.
Run Code Online (Sandbox Code Playgroud)

没有意义.

Mik*_*all 15

嗯,有免费的方式和$$$方式.我不能在这里记录所有内容,但这应该让你开始.

另外,Windows Installer是一项令人抓狂的技术.有很多次我认为任务很简单,但实际上它变得复杂了.你必须让自己沉浸在理解中.

无论如何,这里是:

免费:WiX(这里)

这是一个从一组XML配置文件生成MSI文件的免费工具.我会让你在网上找到教程,但这里有关键:

您可以使用WXS文件中的以下标记将EXE压缩到安装程序中:

<Binary Id="MYEXE" src="<path to my exe?"/>
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建一个启动EXE文件的自定义操作:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>
Run Code Online (Sandbox Code Playgroud)

然后,您插入自定义操作成InstallExecuteSequence在适当的位置(我几乎总是运行矿井某处之间InstallInitializeInstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>
Run Code Online (Sandbox Code Playgroud)

$$$:获取InstallShield(HERE)

首先创建一个"基本MSI"项目,并确保您说您不希望生成setup.exe.您可以在"发布"设置中进行设置.

然后你基本上做与WiX相同的事情,但你有一个用户界面.

  • 您可以使用直接编辑器指定助手EXE文件,并将EXE文件放在"二进制"表中
  • 您可以创建自定义操作以从左侧树中的"自定义操作"节点启动该EXE文件
  • 您可以通过选择"安装序列",并把它在插入自定义动作InstallExecuteSequence之间的某处InstallInitialize,并InstallFinalize正如我以前说过.

对不起,我不能更详细,但这应该是一个好的开始.


GvS*_*GvS 6

我认为创建.MSI文件最简单的方法是使用WiX.

WiX教程的第1课是创建简单安装所需的全部内容.

  • 该链接现在被禁止(403).这是三年之后. (2认同)

now*_*ed. 2

添加到weir's答案,更改custom action attribute如下:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>
Run Code Online (Sandbox Code Playgroud)

设置Return=asyncNoWai不等待exe返回。安装程序完成其工作并正常关闭。与此同时,exe它的持续执行。

-马杜雷什

  • 哈哈..也许对其他人有用 (2认同)