3

我正在为具有安装先决条件的应用程序创建一个 .msi 包。我正在使用 Visual Studio 2005 Bootstrapper 来完成这项任务。为此,我做了以下操作:找到文件夹 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ 并为我的先决条件创建了一个文件夹(使其结构与“dotnetfx”相同) ; 创建了“product.xml”和“package.xml”并将它们适当地放置。到目前为止,我保持 xml 文件非常简单以测试安装:

产品.xml

<?xml version="1.0" encoding="utf-8"?>
<Product ProductCode="MyPrereq" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <PackageFiles CopyAllPackageFiles="false">
    <PackageFile Name="MyPrereq.exe" />
  </PackageFiles>
  <InstallChecks>
  </InstallChecks>
  <Commands Reboot="None">
    <Command PackageFile="MyPrereq.exe" EstimatedInstallSeconds="90">
      <InstallConditions>
      </InstallConditions>
      <ExitCodes>
    <ExitCode Value="0" Result="Success"/>
        <DefaultExitCode Result="Fail" String="GeneralFailure" FormatMessageFromSystem="true" />
      </ExitCodes>
    </Command>
  </Commands>
</Product>

包.xml

<?xml version="1.0" encoding="utf-8"?>
<Package Name="MyPrereq" Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <Strings>
    <String Name="Culture">en</String>
    <String Name="DisplayName">MyPrereq</String>
    <String Name="GeneralFailure">A fatal error occurred. The installation failed.</String>
  </Strings>
</Package>

现在我可以从列表中添加先决条件并构建我的设置项目。

问题:

构建输出是“setup.exe”、“MyApp.msi”包,以及名为“MyPrereq”的子文件夹,其中包含“MyPrereq.exe”。

我希望构建创建一个“setup.exe”和一个“MyApp.msi”,其中包含“MyPrereq”,没有其他文件/目录。

我知道 .NET 框架是我的应用程序的另一个先决条件,它包含在同一个 .msi 中,因此应该以某种方式实现。

我怎样才能做到这一点?

4

2 回答 2

4

您可以使用 IExpress(Windows 随附)等工具创建一个自解压安装程序,其中包含单个可执行文件中的所有文件(请参阅此 SO 发布)。

您不能让 MSI 文件安装其自己的先决条件。首先,因为 Windows Installer 本身是先决条件(并且必须由非 MSI exe 安装),其次因为 Windows Installer 安装是事务性的,不支持 MSI 文件的链式执行。这基本上意味着一个 MSI 安装无法启动另一个 MSI 安装。因此,任何先决条件都必须由单独的引导程序安装(顺便说一下,安装不再是事务性的 - 如果您的 MSI 安装失败,则不会卸载先决条件)。

不过,似乎对引导程序机制存在基本的误解。引导程序目前只能由 Visual Studio 或 MSBuild 生成。Afaik WiX 是不可能的。在 MSBuild 中查找 GenerateBootstrapper 任务(请参阅此 SO 帖子)。

于 2009-02-19T22:59:39.310 回答
3

我设法用 IExpress 做到了这一点。

但是,必须使用一个小技巧,此处描述 了为 VS Shell 应用程序创建引导程序

不幸的是,MSBuild 任务没有提供让配置资源使用在目标目录中找到的先决条件安装程序的选项,因此您必须手动更新相应的资源文件以删除在子目录中查找先决条件的硬编码路径同名。

  • 在 Visual Studio 的资源编辑器中打开 Setup.exe 程序
  • 双击41文件夹中名为SETUPCFG的资源
  • 搜索“Vs Shell\”字符串并删除出现的两次
  • 保存资源文件,Setup.exe 可执行文件将自动更新
  • 运行 iexpress
  • 按照 IExpress 向导的步骤创建一个新包,并确保包含以下文件:
  • MyVSShellApplication.msi 文件
  • Setup.exe 引导程序文件
  • vs_shell_isolated.enu.exe 文件

  • 问题是引导程序将先决条件放入子文件夹中,而 IExpress 无法识别子文件夹。在编辑“setup.exe”时也必须小心,第一次尝试时没有正确。

    于 2009-02-20T02:58:21.983 回答