WiX 安装程序 msi 未安装使用 Visual Studio 2017 创建的 Winform 应用程序

Posted

技术标签:

【中文标题】WiX 安装程序 msi 未安装使用 Visual Studio 2017 创建的 Winform 应用程序【英文标题】:WiX installer msi not installing the Winform app created with Visual Studio 2017 【发布时间】:2018-06-06 19:59:57 【问题描述】:

为了一个简单的测试,我为一个简单的 Winform 应用程序创建了一个 Wix 安装程序应用程序,如下所示。但是当我运行使用安装程序创建的msi 时,它只运行一秒钟并退出而不安装 Winform 应用程序。 问题:这可能是什么问题?我的Product.wxs 文件中似乎缺少某些内容。 注意:我使用的是VS2017

产生问题的步骤

    从here 安装Wix Toolset Visual Studio 2017 Extension 并按照他们的说明从here 安装WiX 3.11 RC2 创建了一个默认的Winform project [只有一个表单,没有添加任何内容] 在同一解决方案中使用Toolset\v3\Setup Project 模板创建了Wix Setup project 在 WiX 安装项目中添加了对 Winform 项目的引用 构建整个解决方案。 右键单击 Setup 项目并重新构建它,在其 \..bin\Debug 文件夹中创建了一个 .msi 文件 双击第 6 步中的 .msi 文件。文件运行了一秒钟,出现了 Windows 10 安装对话框(因为它出现在任何询问您是否要安装此程序的安装中)。我点击了Yes。安装程序再次运行一秒钟然后退出。但未安装 Winform 应用。

默认 Product.wxs 文件 [我这里除了给Manufacturer 属性添加一个值外没有添加任何东西]

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="WiX_test_4_Winfrm" UpgradeCode="e69fe67b-5c28-4764-8196-a6613b840eff">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

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

        <Feature Id="ProductFeature" Title="SetupProject1" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="SetupProject1" />
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
            <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
            <!-- <Component Id="ProductComponent"> -->
                <!-- TODO: Insert files, registry keys, and other resources here. -->
            <!-- </Component> -->
        </ComponentGroup>
    </Fragment>
</Wix>

【问题讨论】:

您可以尝试更新 ComponentGroup 以包含 TODO 评论中所说的一些组件吗?您现在似乎没有安装任何文件。 @DylanMusil 根据您的建议,我在ComponentGroup 标签中添加了以下内容,但仍然是同样的问题:&lt;Component Id="CMP_SetupProject1"&gt; &lt;File Id="File_WIX_WinfrmTest.exe" Source="$(var.WIX_WinfrmTest.TargetPath)" KeyPath="yes" /&gt; &lt;/Component&gt;。我同意你的观点,我在这个项目中遗漏了一些东西。 @DylanMusil 实际上你的建议确实有效。在我运行 .msi' exe (as explained in step 6 of my post) the Winform app was installed but it was insie the C:\Program Files (x86)\SetupProject1` 之后,我在 StartMenu 中寻找它 - 但只有在您向 WiX 添加高级 UI 功能时,应用才会出现在 StartMenu 中安装程序,我还没有做的事情。 【参考方案1】:

WiX 资源:首先是几个链接:

WiX quick start resources.

Hello WiX C# Custom Actions.


“Hello WiX”(请透明铝)

我认为你需要的是the "Hello World" of WiX from CodeProject。这现在已经很老了,但仍然很好地向您展示了编译工作 MSI 的基础知识。

更新:下面我添加了关于如何从新的 WiX 3 Visual Studio 项目编译 MSI 的分步说明。

这是另一个答案,其中包含有关 WiX 真正含义的一些上下文信息:MSI vs nuget packages: which are is better for continuous delivery?。您还可以在此处找到“hello world”的链接,以及其他几个链接。

总结:查看第一个链接以获取 WiX 的“hello world”。然后用几个测试组件更新你的源代码并重新编译。您应该获取 Orca(SDK 工具)才能查看已编译的 MSI 文件。由于您已安装 Visual Studio,请尝试搜索 Orca-x86_en-us.msi 并安装它(这是 Microsoft 自己的官方 MSI 查看器和编辑器)。然后在开始菜单中找到 Orca。从技术上讲,Orca 是作为 Windows SDK(不是 Visual Studio)的一部分安装的,但 Windows SDK 与 Visual Studio 安装捆绑在一起。一旦你有一个编译的 MSI 文件,只需右键单击它并选择 Edit with Orca

在这样的文件真正有意义之前,需要一些经验。本质上,它是存储在 COM 结构化存储文件 (OLE) 中的原始 MS SQL 数据库。本质上是文件中的文件系统,其中包含用于不同内容(例如文件和数据表等)的流。只需将其视为具有正常引用完整性的数据库,并首先关注FileComponent等核心表。


最小的 WiX MSI 编译 - 逐步

让我尝试逐步描述您可以在新制作的 WiX 3 项目中执行哪些操作,以使其使用默认的 WiX GUI 进行编译。您可以在答案的最后一部分中看到这些更改“合并”成一个完整的示例,但请逐步阅读此内容,这样才有意义。

    创建一个新的 WiX3 项目。你知道怎么做,我不会在细节上浪费时间。

    Manufacturer 属性设置为您的公司名称。现在将您选择的新名称设置为Name 属性。在此示例中,它设置为 MinimalTester - 请使用其他内容。

    &lt;MediaTemplate /&gt; 更改为 &lt;MediaTemplate EmbedCab="yes" /&gt; 以在 MSI 中使用嵌入式 cab 文件。这样只创建了 MSI,没有额外的外部 CAB 文件。

    直接在 MediaTemplate 元素之后添加:&lt;UIRef Id="WixUI_Mondo" /&gt;。这将为您的 MSI 添加一个默认 WiX 对话框集,因此它具有更通用所需的基础知识。您现在可以运行修复和修改,并且您会按照大多数 MSI 文件从 Installshield 或 Advanced Installer 或其他专业工具提供的方式获得原始安装向导。至关重要的是:您的 administrative installation 将有一个对话框,您可以在其中指定文件应提取到的位置。

    我们会将我们自己的许可协议添加到 WiX 设置中(否则您会得到一个含糊不清的默认协议)。直接在&lt;UIRef Id="WixUI_Mondo" /&gt; 之后添加这个元素:&lt;WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" /&gt;。现在创建文件TestLicenseAgreement.rtf 并将其放在与您的主要 WiX 源文件相同的文件夹中(快速方法:在 Visual Studio 中,右键单击项目和“在文件资源管理器中打开文件夹”,现在用右键单击创建 RTF 文件 =>新 => RTF 文件 .也许打开 RTF 并输入一些测试文本)。 Further customization of the dialogs(位图等)。

    WiX 对话框集是在 dll 中定义的,我们需要引用它。在您的 Visual Studio WiX 项目中:Right click References =&gt; Add Reference... =&gt; Navigate to C:\Program Files (x86)\WiX Toolset v3.11\bin\。双击WixUIExtension.dll,最后点击OK

    现在在 WiX 中添加 absolute minimum component possible,并将绝对路径指定为源。这是为了确保您可以编译 MSI。之后,您可以将路径设为相对路径或变量(现在只需将其直接添加到 INSTALLFOLDER 目录元素下):

  <Component Feature="ProductFeature">
    <File Source="C:\Users\someone\SourceControl\MyProject\CoreApp.exe" />
  </Component>
    最后右键单击解决方案中的 WiX 项目并选择Build。您可以通过右键单击 WiX 项目并单击 Open Folder in File Explorer 来快速测试运行 MSI。现在双击bin,然后双击Debug(或者如果您切换到发布版本,则为发布-不确定两种配置之间的“默认差异”是什么)。您应该会在对话序列的第二个对话中看到您自己的许可协议。

较新的 WiX 版本具有很好的默认属性,这些属性几乎总是设置为“模板值”,或者两个属性本质上是多余的。只需将它们从源代码中删除,让 WiX 编译器使用默认值添加它们。少得多大惊小怪。

例如:上面的元素缺少Component Id。在编译期间,它默认为其包含的 File 元素的 Id。反过来,File element Id 也丢失了,并将默认为Source attribute 指定的文件名(这是一个强制属性)。

也许看看这个答案以获得更长的描述和一个具体的例子:Syntax for guids in WIX?看看一旦你消除了某些属性的所有冗余和重复,你的 WiX 源文件会变得多么简单?更少的文字,更少的错误。


最小 WiX 源示例 - 内联注释

在下面的示例中,组件已被移动到默认的 ComponentGroup - 因此无需指定它所属的功能(与上面不同)。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <!--CHANGE 0: Set Manufacturer attribute to something, you must also specify a full GUID for UpgradeCode -->
  <Product Id="*" Name="MinimalTester" Language="1033" Version="1.0.0.0" Manufacturer="My Company" UpgradeCode="PUT-GUID-HERE">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    
    <!--Standard: <MediaTemplate />-->
    <!--CHANGE #1: Enable embedded cab files, so there is only one file generated, the MSI file -->
    <MediaTemplate EmbedCab="yes" /> 
    
    <!--CHANGE #2: Add the following elements to link one of the default WiX GUI sequences and show the specified license agreement. The RTF file must be created and placed next to your WiX source file -->
    <UIRef Id="WixUI_Mondo" /> 
    <WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" />        

    <!--CHANGE #3: Add WiX dll reference. In Visual Studio WiX project: Right click References => Add Reference... => Navigate to C:\Program Files (x86)\WiX Toolset v3.11\bin\. Double click WixUIExtension.dll. Click OK -->

    <Feature Id="ProductFeature" Title="MinimalTester" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="MinimalTester" />
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      
      <!--CHANGE #4: Remove TODO elements, add the most basic component possible as illustrated below -->
      <Component>
        <File Source="C:\Users\someone\SourceControl\MyProject\CoreApp.exe" />
      </Component>

    </ComponentGroup>
  </Fragment>
</Wix>

尝试编译和测试安装。应该在普通系统上安装到C:\Program Files (x86)\MinimalTester

也许可以在此处查看有关 WiX 教程的更多链接:WIX Installer not displaying the custom image of WixUI Dialog correctly。

【讨论】:

【参考方案2】:

试试这个:

https://github.com/iswix-llc/iswix-tutorials

https://www.youtube.com/watch?v=nnV_OU6fk8c

免责声明:我是 IsWiX 的维护者,这是一个 FOSS WiX 加速器,它提供增强的项目模板(脚手架)和图形设计师来为您完成大部分 WiX XML 繁重工作。从视频中可以看出,这很容易只需几分钟的工作。

【讨论】:

酷,我已将这些链接合并到 IsWiX 部分:***.com/questions/1544292/…

以上是关于WiX 安装程序 msi 未安装使用 Visual Studio 2017 创建的 Winform 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

部署时 WIX MSI 应用程序未在用户帐户下启动应用程序

WIX安装项目未完全卸载应用程序

使用 WiX 为 InstallShield 安装程序创建 msi 包装器

Visual Studio 安装程序 msi 未更新 UI

WiX 刻录包安装程序 - 升级安装时未更新 ExePackage

在安装过程中,Wix MSI未显示选择“目标文件夹”的屏幕