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

产生问题的步骤


here安装Wix Toolset Visual Studio 2017 Extension,并按照他们的指示从here安装WiX 3.11 RC2
创建了一个默认的Winform project [只是一个表单,没有添加任何内容]
在同一解决方案中使用Wix Setup project模板创建了Toolset\v3\Setup Project
在WiX安装项目中添加了对Winform项目的引用
构建了整个解决方案。
右键单击安装项目,然后重新构建它,从而在其.msi文件夹中创建一个\..bin\Debug文件
双击步骤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>

最佳答案

“ 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-请使用其他名称。
<MediaTemplate />更改为<MediaTemplate EmbedCab="yes" />以使用MSI中的嵌入式cab文件。这样,仅创建了MSI,并且没有其他外部CAB文件。
在MediaTemplate元素之后,直接添加以下内容:<UIRef Id="WixUI_Mondo" />。这将向您的MSI添加默认的WiX对话框集,因此它具有更通用的功能所需要的基本知识。现在,您可以运行修复并进行修改,并且会按照大多数MSI文件从Installshield或Advanced Installer或其他专业工具提供的内容进行安装向导。至关重要的是:您的administrative installation将有一个对话框,您可以在其中指定将文件提取到的位置。
我们将自己的许可协议添加到WiX设置中(否则您将得到一个默默无闻的默认协议)。直接在<UIRef Id="WixUI_Mondo" />之后添加以下元素:<WixVariable Id="WixUILicenseRtf" Value="TestLicenseAgreement.rtf" />。现在创建文件TestLicenseAgreement.rtf并将其放置在与主WiX源文件相同的文件夹中(快速方法:在Visual Studio中,右键单击项目,然后单击“在文件资源管理器中打开文件夹”,然后右键单击=>创建RTF文件。新=> RTF文件
。也许打开RTF并输入一些测试文本)。 Further customization of the dialogs(位图及更多)。
WiX对话框集在dll中定义,我们需要引用它。在您的Visual Studio WiX项目中:Right click References => Add Reference... => Navigate to C:\Program Files (x86)\WiX Toolset v3.11\bin\。双击WixUIExtension.dll,最后单击OK
现在,使用指定为源的绝对路径添加WiX中可能的绝对最小组件。这是为了确保您可以编译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

关于c# - WiX安装程序MSI未安装使用Visual Studio 2017创建的Winform应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47970743/

10-15 10:55