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

2024-02-05

为了进行简单的测试,我创建了一个Wix简单 Winform 应用程序的安装程序应用程序如下。但是当我运行msi使用安装程序创建,它运行仅一秒钟,然后退出而不安装 Winform 应用程序。Question: 这可能是什么问题?我的身上似乎缺少了一些东西Product.wxs file. Note: 我在用着VS2017

产生问题的步骤

  1. 已安装Wix Toolset Visual Studio 2017 Extension from here https://marketplace.visualstudio.com/items?itemName=RobMensching.WixToolsetVisualStudio2017Extension并按照他们的说明进行安装WiX 3.11 RC2 from here http://wixtoolset.org/releases/
  2. 创建了默认值Winform project[只是一种形式,没有添加任何内容]
  3. 创建了一个Wix Setup project通过使用Toolset\v3\Setup Project同一解决方案中的模板
  4. 在 WiX 安装项目中添加了对 Winform 项目的引用
  5. 构建了整个解决方案。
  6. 右键单击安装项目并重新构建它,创建了一个.msi文件在其\..bin\Debug folder
  7. 双击.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>

维克斯资源: 先放几个链接:

  • WiX 快速入门资源 https://stackoverflow.com/questions/25004226/msi-vs-nuget-packages-which-are-is-better-for-continuous-delivery/25005864#25005864.

  • Hello WiX C# 自定义操作 https://stackoverflow.com/questions/60383913/how-do-i-add-c-sharp-methods-to-an-existing-large-wix-script/60384739#60384739.


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

我想你需要的是来自 CodeProject 的 WiX 的“Hello World” https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with。虽然现在已经很老了,但仍然可以很好地向您展示编译工作 MSI 的基础知识。

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

这是另一个很久以前的答案,其中包含一些有关 WiX 真正含义的上下文信息:MSI 与 nuget 包:哪个更适合持续交付? https://stackoverflow.com/questions/25004226/msi-vs-nuget-packages-which-are-is-better-for-continuous-delivery/25005864#25005864。您还可以在这里找到“hello world”的链接,还有其他几个链接。

总之:查看第一个链接获取WinX的“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 and Component首先。


最小 WiX MSI 编译 - 分步

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

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

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

  3. Change <MediaTemplate /> to <MediaTemplate EmbedCab="yes" />在 MSI 中使用嵌入的 cab 文件。这样,仅创建 MSI,并且没有额外的外部 CAB 文件。

  4. 直接在 MediaTemplate 元素后面添加以下内容:<UIRef Id="WixUI_Mondo" />。这将添加一个默认 WiX 对话框集到您的 MSI,因此它具有更通用所需的基础知识。现在,您可以运行修复和修改,并获得原始安装向导,该向导与大多数 MSI 文件从 Installshield 或高级安装程序或其他专业工具提供的向导相同。至关重要的是:你的行政安装 https://stackoverflow.com/questions/48317349/msiexec-a-deploying-msi-filewix/48325116#48325116将有一个对话框,您可以在其中指定文件应提取到的位置。

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

  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>
  1. 最后右键单击解决方案中的 WiX 项目并选择Build。您可以通过右键单击 WiX 项目并单击来快速测试运行 MSIOpen Folder in File Explorer。现在双击bin进而Debug(如果您切换到发布版本,则发布 - 不确定两种配置之间的“默认差异”是什么)。您应该在对话框序列的第二个对话框中看到您自己的许可协议。

更高版本的 WiX 版本对几乎总是设置为“模板值”或两个属性本质上是冗余的属性有很好的默认值。只需将它们从源代码中删除,并让 WiX 编译器添加默认值即可。少了很多麻烦。

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

也许看看这个答案以获得更长的描述和底部的具体示例:WIX 中的指南语法? https://stackoverflow.com/questions/24732761/syntax-for-guids-in-wix/24769965#24769965一旦您消除了某些属性的所有冗余和重复,您是否会发现您的 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 安装程序未正确显示 WixUI 对话框的自定义图像 https://stackoverflow.com/questions/47965974/wix-installer-not-displaying-the-custom-image-of-wixui-dialog-correctly/47973061#47973061.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le

随机推荐