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

时间:2017-12-25 17:33:14

标签: c# winforms wix windows-installer visual-studio-2017

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

产生问题的步骤

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

    Yes

2 个答案:

答案 0 :(得分:4)

" 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"的链接。在这里,还有其他几个链接。

总结:检查第一个链接以获取" hello world" WiX。然后使用几个测试组件更新源代码并重新编译。您应该掌握 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进行编译。你可以看到这些变化"合并"在答案的最后一部分中提供了一个完整的示例,但请逐步阅读,以便它有意义。

  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或其他专业工具提供的内容修改并获得原始安装的向导。至关重要的是:您的administrative installation会有一个对话框,您可以在其中指定应将文件提取到的位置。

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

  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目录元素下添加它):

  8.   <Component Feature="ProductFeature">
        <File Source="C:\Users\someone\SourceControl\MyProject\CoreApp.exe" />
      </Component>
    
    1. 最后右键单击解决方案中的WiX项目,然后选择Build。您可以通过右键单击WiX项目并单击Open Folder in File Explorer来快速测试运行MSI。现在双击bin,然后双击Debug(如果您切换到发布版本,则发布 - 不确定&#34;默认差异&#34;在两种配置之间)。您应该在对话框序列的第二个对话框中看到自己的许可协议。
    2. 后来的WiX版本具有很好的默认属性,几乎总是设置为&#34;模板值&#34;或者两个属性基本上是多余的。只需将它们从源代码中删除,让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

答案 1 :(得分:1)

试试这个:

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

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

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