【问题标题】:How to generate msi from windows application如何从 Windows 应用程序生成 msi
【发布时间】:2017-07-02 21:28:52
【问题描述】:

我有一个 Windows 应用程序类,我在其中定义了我的 Windows 服务,我需要从中生成一个 .msi(安装程序)。 到目前为止我所做的是:在 Visual Studio Enterprise 2017 中创建一个新项目 - 该项目的类型为 Wix v3 的安装项目(来自 Wix 工具集);在这个项目中,我默认有 References 和 Product.wxs。从 Add References, Projects 中,我添加了 Service 项目。

我发现的一个消息来源说,所需要的只是添加

Source="$(var.MyApplication.TargetPath)" />

如此处所示: http://wixtoolset.org/documentation/manual/v3/votive/authoring_first_votive_project.html

...但这对我不起作用,因为:

未定义的预处理器变量 $(var.MyApplication.TargetPath)

我不知道在哪里定义这个变量,这个路径的含义是什么。 摘录在这里:

<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. -->
         <File Source = "$(var.MyApplication.TargetPath)"/>
       </Component> 
        </ComponentGroup>

有什么想法吗?

谢谢。 这是除 File Source 行之外的所有自动生成的代码。也不知道我应该为 INSTALLFOLDER 添加什么以及语法应该是什么。 目的是从我的 Windows 服务生成 .msi

【问题讨论】:

  • 考虑尝试InnoSetup。它可能比处理 Wix 项目更快、更容易,而且肯定比投资 InstallShield 便宜。

标签: c# wix windows-installer


【解决方案1】:

此步骤的 Wix 文档至少在 3.11 版中已损坏。

您需要将 Wix 设置添加为 Windows 窗体解决方案中的第二个项目,而不是创建两个单独的解决方案(应用程序和 Wix)。在应用解决方案资源管理器窗格中,右键单击解决方案,然后选择添加 > 新项目。选择一个类似 WixSetup 的名称。

接下来,单击 WixSetup 项目 > 参考并选择添加新参考。项目列表应显示您的应用,因为它们位于同一解决方案中。

接下来,将条目添加到 Product.wxs 中,但那里的文档也不正确,您需要将其包装在组件选项卡中。 (将 MY-APPLICATION-NAME 替换为您的 Windows 窗体应用项目的名称。)

<Component Id="ProductComponent">
    <File Source="$(var.MY-APPLICATION-NAME.TargetPath)" />
</Component>

您还需要编辑 .wsx 的第 3 行以包含非空公司名称或删除该属性:

<Product Id="*" Name="WixSetup" Language="1033" Version="1.0.0.0" Manufacturer="MY-COMPANY"

最后,在构建 Wix MSI 之前,您的主应用程序中必须有一个发布版本。

【讨论】:

  • 非常感谢你,戴夫!不幸的是,我得到一个未定义的预处理器变量 $(var.MY-APPLICATION-NAME.TargetPath) 错误,应该将 MY-APPLICATION-NAME 替换为 Windows 应用程序项目的名称还是其他名称?顺便说一句,我的 win 应用程序项目包含点,因此可能会干扰最后一部分(.TargetPath)。但这对我来说听起来像是一个应该在某个地方定义的 var,不知何故?
  • 是的:“(将 MY-APPLICATION-NAME 替换为您的 Windows 窗体应用程序的名称。)” :) 。因此,如果您的 winforms 项目是 Awesome-App,&lt;File Source="$(var.Awesome-App.TargetPath)" /&gt;。如果点中断,您需要重命名项目。
  • 谢谢。安装 msi 后是否会立即触发来自我的 Win 应用服务(源自 ServiceBase)的 onStart 方法?
  • 你需要谷歌,我只使用桌面应用程序而不是服务。除非这是新服务安装的默认行为,否则您需要对 MSI 进行某种自定义。 PS - 不要忘记将答案标记为已接受:)
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多