WiX静默安装无法启动内置的.EXE:WiX v3

时间:2018-08-14 00:25:39

标签: c# wix windows-installer custom-action

我知道这似乎是重复的,但我几乎在线尝试了所有方法,包括以下链接:

使用双击时,安装成功完成,并启动我的EXE,即WPF UI。

问题是,如果在命令行中运行,则会安装WiX安装程序,但我的WPF无法启动。没有驱动程序更新。 请注意,我有一些自定义开关,例如/?。在我的WPF中/ q / forerestart / noreboot。

Launch after install, with no UI? http://wixtoolset.org/documentation/manual/v3/howtos/ui_and_localization/run_program_after_install.html

以下是我的代码

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><?define INF_INSTALLER_TargetDir=$(var.INF_INSTALLER.TargetDir)?>
    <Product Id="guid here" Name="INF_INSTALLER" Language="1033" Version="1.1.1.3" Manufacturer="Intel Corporation" UpgradeCode="guid here">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"  InstallPrivileges="elevated" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes" />

    <!--User Agrrement-->
    <WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)EULAsingleuselicense.rtf" />
    <WixVariable Id="WixUIBannerBmp" Value="images\Banner.jpg" />
    <WixVariable Id="WixUIDialogBmp" Value="images\Background.png" />


    <!--Chosing the UI version-->
    <!-- Step 2: Add UI to your installer / Step 4: Trigger the custom action -->
    <!-- UI to installer -->
    <UI>
      <UIRef Id="WixUI_Minimal" />
      <!-- Launch the applicaiton -->
      <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">NOT Installed</Publish>
    </UI>
    <!--<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch INF INSTALLER" /> -->

    <!-- Step 3: Include the custom action -->
    <Property Id="WixShellExecTarget" Value="[#INF_INSTALLER.exe]" />
    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />



    <Feature Id="ProductFeature" Title="INF INSTALLER" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentRef Id="ApplicationShortcut" />
      <!--<ComponentRef Id="ApplicationShortcutDesktop" /> -->
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="TempFolder">
        <Directory Id="ManufacturerFolder" Name="INF_INSTALLER">
          <Directory Id="INSTALLFOLDER" Name="INF_INSTALLER" />
        </Directory>
        <Directory Id="ProgramMenuFolder">
          <Directory Id="ApplicationProgramsFolder" Name="!(bind.property.ProductName)" />
        </Directory>
        <!--<Directory Id="DesktopFolder" Name="Desktop" />-->
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="guid here">
        <Shortcut Id="ApplicationStartMenuShortcut" Name="!(bind.property.ProductName)" Description="INF INSTALLER" Target="[INSTALLFOLDER]INF_INSTALLER.exe" WorkingDirectory="INSTALLFOLDER" />
        <RemoveFolder Id="RemoveApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\INF_INSTALLER" Name="installed" Type="integer" Value="1" KeyPath="yes" />
      </Component>
    </DirectoryRef>
    <!--<DirectoryRef Id="DesktopFolder">
      <Component Id="ApplicationShortcutDesktop" Guid="guid here">
        <Shortcut Id="ApplicationDesktopShortcut" Name="!(bind.property.ProductName)" Description="INF INSTALLER" Target="[INSTALLFOLDER]INF_INSTALLER.exe" WorkingDirectory="INSTALLFOLDER" />
        <RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\INF_INSTALLER" Name="InstalledCompleted" Type="integer" Value="1" KeyPath="yes" />
      </Component>
    </DirectoryRef>-->
  </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
            <Component Id="windowscert.cer" Guid="guid here">
              <File Id="windowscert.cer" Name="windowscert.cer" Source="$(var.INF_INSTALLER_TargetDir)windowscert.cer" />
            </Component>
            <Component Id="myinf.inf" Guid="guid here">
              <File Id="myinf.inf" Name="myinf.inf" Source="$(var.INF_INSTALLER_TargetDir)myinf.inf" />
            </Component>
            <Component Id="INF_INSTALLER.exe" Guid="guid here">
              <File Id="INF_INSTALLER.exe" Name="INF_INSTALLER.exe" Source="$(var.INF_INSTALLER_TargetDir)INF_INSTALLER.exe" />
            </Component>
            <Component Id="INF_INSTALLER.exe.config" Guid="guid here">
              <File Id="INF_INSTALLER.exe.config" Name="INF_INSTALLER.exe.config" Source="$(var.INF_INSTALLER_TargetDir)INF_INSTALLER.exe.config" />
            </Component>
            <Component Id="INF_INSTALLER.pdb" Guid="guid here">
              <File Id="INF_INSTALLER.pdb" Name="INF_INSTALLER.pdb" Source="$(var.INF_INSTALLER_TargetDir)INF_INSTALLER.pdb" />
            </Component>
        </ComponentGroup>
    </Fragment>

  <Fragment>

    <CustomAction Id="LaunchFile" FileKey="INF_INSTALLER.exe" ExeCommand="/quiet" Return="asyncNoWait" />

    <Property Id="WixSilentExecCmdLine" Value="/silent" Hidden="yes"/>
    <CustomAction Id="SilentExecExample" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="check"/>

    <InstallExecuteSequence>

      <Custom Action="LaunchFile" After="InstallFinalize">NOT  Installed</Custom>
      <Custom Action="SilentExecExample" After="TheActionYouWantItAfter"/>
      <RemoveExistingProducts After="InstallFinalize" />

    </InstallExecuteSequence>


  </Fragment>
</Wix>

1 个答案:

答案 0 :(得分:0)

错误的配置 :无论静默或交互模式如何,此行都将永远不会运行:

<Custom Action="SilentExecExample" After="TheActionYouWantItAfter"/>

After属性必须指定一个有效的 StandardAction CustomAction 名称。

静默模式失败 :下面的行将在静默模式下失败,因为您在InstallFinalize之后运行它。在这种情况下,它将不会随着海拔升高而运行(除非您从升高的cmd.exe提示符下启动安装程序),因此无法完成安装(安装过程仅在InstallInitializeInstallFinalize之间升高运行)在InstallExecuteSequence中):

<Custom Action="LaunchFile" After="InstallFinalize">NOT  Installed</Custom>

还有一些您应该知道的事情。请阅读以下内容。


Windows Update分发 :据记录,Microsoft似乎希望将来通过Windows Update或至少通过独立的软件包分发驱动程序,而不需要安装程序。

从Windows 10版本1607开始:


驱动程序元素 :WiX当前具有Driver Element用于安装驱动程序。据我所知,它在后台使用了DIFx框架。 A small, practical example found on github.com。我从未使用过此功能。 FireGiant's WiX Expansion Pack具有更高级的驱动程序安装支持。从未尝试过我。

DPInst.exe :我不熟悉 INF_INSTALLER.exe -这是您创建的专有组件吗?也可以使用DIFx框架中的DPInst.exe工具来安装签名的驱动程序。它可以通过MSI内部的自定义操作来调用,也可以直接从Burn(WiX Bundle-换句话说,不是MSI的一部分)运行。 A fairly short example found on github.com。还有a second example found on github.com-可能是一个更好的示例。

小提示 :搜索"DPInst.exe http://schemas.microsoft.com/wix/2006/wi"将产生大量匹配。根据我的经验,您可以使用此github搜索技术查找有关任何内容的帮助。不过请务必谨慎,我会利用节省的时间进行额外的测试。就是我的2美分。


某些链接