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

nam*_*nam 1 c# windows-installer wix winforms visual-studio-2017

为了进行简单的测试,我Wix为一个简单的Winform应用程序创建了一个安装程序应用程序,如下所示。但是,当我msi使用安装程序运行创建的文件时,它只运行一秒钟,然后退出而未安装Winform应用程序。问题:这里可能是什么问题?我的Product.wxs文件似乎丢失了一些东西。注意:我正在使用VS2017

产生问题的步骤

  1. Wix Toolset Visual Studio 2017 Extension这里安装,并按照他们的指示WiX 3.11 RC2这里安装
  2. 创建一个默认值Winform project[仅添加一个表单,不添加任何内容]
  3. 在同一解决方案中Wix Setup project使用Toolset\v3\Setup Project模板创建了一个
  4. 在WiX安装项目中添加了对Winform项目的引用
  5. 构建了整个解决方案。
  6. 右键单击安装项目,然后重新构建它,.msi在其\..bin\Debug文件夹中创建一个文件
  7. 双击.msi步骤6中的文件。文件运行一秒钟,出现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>
Run Code Online (Sandbox Code Playgroud)

Ste*_*mul 5

“ Hello WiX”(请使用透明铝)

我认为您需要的是CodeProject的WiX的“ Hello World”。现在这已经很老了,但是仍然可以很好地向您展示如何编译有效的MSI的基本知识。

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

这是从另一个角度回溯的答案,其中包含有关WiX真正含义的一些上下文信息:MSI与nuget包:哪种方法更适合连续交付?。您还将在此处找到指向“ 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数据库。本质上,文件中的文件系统具有用于不同内容(例如文件和数据表等)的流。只需将其视为具有正常参照完整性的数据库,并首先关注诸如File和之类的核心表即可Component


最小的WiX MSI编译-分步进行

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

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

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

  3. 更改<MediaTemplate /><MediaTemplate EmbedCab="yes" />在MSI中使用嵌入式cab文件。这样,仅创建了MSI,并且没有其他外部CAB文件。

  4. 在MediaTemplate元素之后,直接添加以下内容:<UIRef Id="WixUI_Mondo" />。这将向您的MSI 添加默认的WiX对话框集,因此它具有更通用的功能所需要的基本知识。现在,您可以运行修复并进行修改,并且会按照大多数MSI文件从Installshield或Advanced Installer或其他专业工具提供的内容,获得用于原始安装的向导。至关重要的是:您的管理安装将有一个对话框,您可以在其中指定将文件提取到的位置。

  5. 我们将自己的许可协议添加到WiX设置中(否则您将得到一个默默无闻的默认协议)。直接在其后<UIRef Id="WixUI_Mondo" />添加此元素:<WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" />。现在创建文件TestLicenseAgreement.rtf,并将其放置在与主WiX源文件相同的文件夹中(快速方法:在Visual Studio中,右键单击项目,然后单击“在文件资源管理器中打开文件夹”),然后右键单击=>新建=>创建RTF文件。 RTF文件,然后打开RTF并输入一些测试文本)。对话框的进一步定制(位图等)。

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

  7. 现在,使用指定为源的绝对路径添加WiX中可能绝对最小组件。这是为了确保您可以编译MSI。之后,您可以将路径设为相对路径或变量(现在就将其直接添加到INSTALLFOLDER目录元素下):

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

更高版本的WiX具有几乎总是设置为“模板值”的属性的默认值,或者其中两个属性本质上是冗余的。只需将它们放在您的源代码之外,然后让WiX编译器将它们添加为默认值即可。大惊小怪。

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

也许看一下这个答案以获得更详细的描述和一个具体的底部示例:WIX中GUID的语法?消除某些属性的所有冗余和重复之后,看看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>
Run Code Online (Sandbox Code Playgroud)

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

也许在这里看到WiX教程的更多链接:WIX安装程序未正确显示WixUI对话框的自定义图像