1

我已经完成了一个安装项目,其中包含几个文件、DLL、一个 Windows 窗体应用程序和一个 Windows 服务。一切都是用 C# (.net) 编写的。

我使用 WiX 来配置 msi 安装,现在文件是这样的:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Id="*" Name="App Name" Language="1033" Version="1.0.0"
           Manufacturer="Company Name" UpgradeCode="GUID-HERE">

    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <Icon Id="InstallIcon" SourceFile="msiicon.ico" />
    <Property Id="ARPPRODUCTICON" Value="InstallIcon" />

    <Media Id="1" Cabinet="SingleCab.cab" EmbedCab="yes" />

    <Feature Id="ProductFeature" Title="Title" Level="1">
      <!-- Some features here-->
    </Feature>

    <UI><!-- Many UI here--></UI>
  </Product>

  <!-- Some fragments tag here -->
</Wix>

但我需要插入 .net Framework 4.0 的检查。如果未安装 .net Framework 4.0,请自动运行 Web 安装。

所以我搜索并找到了许多类似的例子来说明如何做到这一点。我发现的几乎所有示例都涉及标签 Bundle、Chain 和 MsiPackage。

我的问题是如何将我所拥有的与我找到的示例相结合。

看,在所有示例中(从这里获取下一行)合并项目发生在这一行:

<MsiPackage
  SourceFile="$(var.SetupProject1.TargetPath)">
</MsiPackage>

但是我没有 Visual Studio 项目,我在 Product 标签中有很多文件。<Bundle>产品标签在内部或内部不起作用,<MsiPackage>所以我知道吗?如何将我所有的<Product>内容都放入其中。

4

1 回答 1

2

首先,让我们建立一些基线知识......

WiX 项目是 Visual Studio 项目。Visual Studio 项目是MSBuild项目。MSBuild 项目是 XML 文件。通常,MSBuild 项目将其他 MSBuild 项目作为库导入(带有 .targets 扩展名),因为构建项目所需的大部分信息对所有相同类型的项目(例如 .csproj)都是通用的。可以使用 .NET Framework 附带的 msbuild.exe 构建 MSBuild 项目。MSBuild 项目最终会执行任务来构建项目。这些任务通常是对命令行工具的调用,或者如果可用的话,是对库的等效函数调用。

要使用 WiX 源文件,需要调用 WiX 的 candle.exe 和 light.exe。要生成一些 WiX 源文件,可以调用 WiX 的 heat.exe。

WiX 提供了 MSBuild 任务来为您执行此操作。它还提供了导入这些任务的 MSBuild 项目模板。您通常会使用诸如Visual Studio(非 express)SharpDevelop(免费)之类的 IDE将项目模板转换为项目。但是你可以手动编写一个项目文件,参考一个例子。同样,可以通过调用 msbuild.exe 来构建此类项目,或者 IDE 可以为您调用 MSBuild。

使用 IDE 编辑 WiX 源文件和项目很方便。可以使用 IDE 的项目设计器或 XML 编辑器来编辑项目文件。(在 VS 的解决方案资源管理器中,执行项目卸载然后项目编辑。)由于源文件和项目都是 XML,IDE 应该根据文件的 XML 模式提供帮助。

许多类型的项目(例如,.csproj 和 .wixproj)允许项目引用其他项目。项目引用的目的和功能取决于项目的 MSBuild 导入。您可能熟悉 C# 项目中的 C# 项目参考。至少,人们会期望在引用项目之前构建引用的项目。

WiX 项目可以引用 .NET 项目(例如 .csproj)或其他 WiX 项目。对于每个项目引用,WiX会根据所引用项目的名称定义一些有用的变量。例如:如果您有一个 WiX Bootstrapper 项目,它可以引用一个名为SetupProject1so的 WiX Setup 项目,该项目var.SetupProject1.TargetPath将被定义为在引导程序源代码中使用。另一个例子:如果你有一个 WiX Setup 项目,它可以引用一个名为ConsoleApplication1so的 C# 项目,因此var.ConsoleApplication1.TargetPath将被定义。在这两个示例中,目标路径很可能会根据项目配置(例如调试、发布)而有所不同。WiX 将变量指向基于配置的引用项目中定义的适当路径。

底线

  1. Product 元素用于 WiX 设置项目;Bundle 元素用于 WiX Bootstrapper 项目。(如果不使用项目文件,您将为产品调用一次 WiX 的命令行工具,为捆绑软件调用一次)。
  2. 对于包元素,SourceFile 应该是相应 msi 或 exe 文件的路径。它可以是路径,也可以是在烛台.exe 命令行上或通过项目引用定义的变量。
  3. 您可能错过了使用 WiX 项目和 MSBuild 的便利。与所有 Visual Studio 项目一样,您可以不使用 IDE,也可以选择免费或付费的 IDE。大概,您已经在为您的 C# 项目使用 IDE 和 MSBuild。将它们用于 WiX 项目与将 VB.NET 项目添加到您的解决方案没有太大区别。

您应该考虑一个引用您的 C# 项目的 WiX Setup 项目和一个引用您的 WiX Setup 项目的 WiX Bootstrapper 项目。构建解决方案,您就完成了!

(当然,在开发过程中,您可能不希望在解决方案中设置项目。在这种情况下,请使用多个解决方案文件。)

于 2013-09-07T23:44:12.480 回答