Wix - 如何在安装目录中安装后运行exe文件?

31

我正在使用一个程序,该程序使用wix进行安装。(不知道是否相关,但它是一个C#程序)

我想运行由msi文件安装的exe文件,但我不知道安装的位置,因为用户选择安装路径。

我想要一个示例来展示如何从用户选择的位置运行exe文件。

尽管这不是问题的一部分,但作为初学者,我也很乐意看到从绝对位置运行exe文件的示例,因为这是我第一次使用wix。

2个回答

52

如果您不需要用户界面,那么Isaiah4110的答案并不是最佳方法。

通过WiX生成的MSI文件安装目标exe文件的最简单方法是使用自定义操作类型18(通过FileKey/FileRef标识操作),以下是v3/v4的完整示例:

WiX v3:

<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
    <Component Id="TargetProgram" Guid="f757ff43-0266-483a-8749-ec796cba4b25" >
        <File Id="EXE" Source="C:\SetupProject\Includes\TargetProgram.exe" />
    </Component>
</ComponentGroup>

<CustomAction Id="EXECUTE_AFTER_FINALIZE"                  
              Execute="immediate" 
              Impersonate="no"
              Return="asyncNoWait"
              FileKey="EXE"
              ExeCommand="" />

<InstallExecuteSequence>
    <Custom Action="EXECUTE_AFTER_FINALIZE" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>
</Fragment>

WiX v4:
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
    <Component Id="TargetProgram" Guid="f757ff43-0266-483a-8749-ec796cba4b25" >
        <File Id="EXE" Source="C:\SetupProject\Includes\TargetProgram.exe" />
    </Component>
</ComponentGroup>

<CustomAction Id="EXECUTE_AFTER_FINALIZE"                  
              Execute="immediate" 
              Impersonate="no"
              Return="asyncNoWait"
              FileRef="EXE"
              ExeCommand="" />

<InstallExecuteSequence>
    <Custom Action="EXECUTE_AFTER_FINALIZE" After="InstallFinalize" Condition="NOT Installed" />
</InstallExecuteSequence>
</Fragment>

4
非常感谢,这太完美了!我不确定为什么每个人都认为在安装后运行文件或者给用户选择时需要一个完整的用户界面。这种方式可以带有或者没有用户界面,因此这应该是一种通用的解决方案。 - Justin Emlay
如果您需要向EXE传递参数,那么在ExeCommand中执行此操作也是可行的。 - Jim W says reinstate Monica
太棒了!正是我所需要的,运行良好...谢谢!Ibai - Kevin Moore
在互联网上搜索了好几天,终于找到了解决方案!!我将复选框选项与您的自定义操作混合使用,效果非常好。 - vendettamit
1
这将使用错误的工作目录启动您的exe。您可以删除 FileKey 并使用 Directory="INSTALLFOLDER"ExeCommand="[INSTALLFOLDER]TargetProgram.exe",然后程序将具有其位置作为工作目录。这是一种类型为34的自定义操作。https://wixtoolset.org/documentation/manual/v3/xsd/wix/customaction.html - horotab
显示剩余3条评论

15

借助WIX扩展程序,可以实现此目标。下面的粗体/斜体文本将处理查找EXE文件确切位置的情况 :)

步骤1:将扩展库添加到您的项目中

如果您正在命令行上使用WiX,您需要将以下内容添加到您的烛光和光线命令行中:

-ext WixUIExtension -ext WixUtilExtension

如果您正在使用Visual Studio,可以使用“添加引用”对话框添加扩展:

Right click on your project in Solution Explorer and select Add Reference...
Select the WixUIExtension.dll assembly from the list and click Add
Select the WixUtilExtension.dll assembly from the list and click Add
Close the Add Reference dialog

步骤2:为您的安装程序添加用户界面

WiX最小UI序列包括一组基本对话框,其中包括一个带有可选复选框的完成对话框。要在您的项目中包含该序列,请在<Product>元素内的任何位置添加以下片段。

<UI>
    <UIRef Id="WixUI_Minimal" />
</UI>

要在安装程序的最后一个屏幕上显示复选框,请在<Product>元素内的任何位置包含以下片段:

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch My Application Name" />

WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT 属性由标准 UI 序列提供,当设置该属性时,将显示复选框并使用指定的值作为复选框标签。

第3步:包括自定义操作

使用 <CustomAction> 元素将自定义操作包含在 WiX 项目中。使用 WixShellExecTarget 自定义操作来运行应用程序。要告诉 Windows 安装程序关于自定义操作,并设置其属性,请在项目中任何位置内包括以下内容,在 <Product> 元素内部:

<Property Id="WixShellExecTarget" Value="[#myapplication.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

Property元素将WixShellExecTarget设置为已安装应用程序的位置。WixShellExecTarget是WixShellExec自定义操作期望设置为要运行的文件位置的属性ID。

Value属性使用特殊字符#告诉WiX查找ID为myapplication.exe的文件的完整安装路径。


CustomAction元素将操作包含在安装程序中。它被赋予唯一的ID,BinaryKey和DllEntry属性指示自定义操作的程序集和入口点。Impersonate属性告诉Windows Installer按照安装用户身份运行自定义操作。

步骤4:触发自定义操作

仅包含自定义操作,如步骤3所述,不足以导致其运行。还必须告诉Windows Installer何时触发自定义操作。这可以通过使用元素将其添加到在UI对话框的最后一页上单击“完成”按钮时运行的操作中来完成。Publish元素应包含在步骤2中的元素内,其如下所示:

<Publish Dialog="ExitDialog"
    Control="Finish" 
    Event="DoAction" 
    Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

Dialog属性指定了自定义操作将附加到的对话框,这里是ExitDialog。Control属性指定对话框上的完成按钮触发自定义操作。Event属性指示当单击该按钮时应运行自定义操作,Value属性指定包含在步骤3中的自定义操作。元素上的条件防止在未选中步骤2中的复选框并且实际安装了应用程序(而不是被删除或修复)的情况下运行该操作。

详细信息请查看如何在安装后运行exe此链接。我将其复制到这里,以使其他寻找相同答案的人受益。


3
当我尝试安装时,安装程序从未退出。当您试图关闭安装程序时,每次单击关闭都会启动一个新的应用程序,但它从未退出。 - Martin Capodici
1
如何使用此方法将命令行参数传递给exe?@Isaiah4110 - taimur alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接