Bootstrapper:如何在单个.msi包中编译应用程序和先决条件?

时间:2009-02-19 22:45:39

标签: visual-studio-2005 windows-installer bootstrapping

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

product.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>

package.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中,所以这应该是可能的。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

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

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

尽管似乎对引导程序机制存在基本的误解。目前只能由Visual Studio或MSBuild生成引导程序。使用WiX是不可能的。在MSBuild中查找GenerateBootstrapper任务(请参阅this SO posting)。

答案 1 :(得分:3)

我设法用IExpress做到了。

但是,不得不使用一个小技巧,这里描述 Creating a bootstrapper for a VS Shell application

  

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

     

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

  • 问题在于引导程序将先决条件放入子文件夹中,而IExpress无法识别子文件夹。在编辑'setup.exe'时也要小心,第一次尝试时没弄错。