views:

1803

answers:

2

I need to include the full .NET 3.5 sp1 installer into my installer, which is in WiX.

I need that boostrapper to be entirely self contained, with no web access at all. It is just not allowed for this installer to require the web; we have customers in outer Mongolia (I'm serious, not just using the place name because it's remote) to whom we ship CDs because they do not have internet access at all.

The WiX tutorial states:

<Target Name="AfterBuild">
    <GenerateBootstrapper ApplicationFile="$(TargetFileName)" 
                      ApplicationName="My Application Name"
                      BootstrapperItems="@(BootstrapperFile)"
                      ComponentsLocation="Relative"
                      CopyComponents="True"
                      OutputPath="$(OutputPath)"
                      Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\"/>
</Target>

The above bootstrapper requires the web. How do I make an installer that does not?

+3  A: 

<Project ToolsVersion="3.5"
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;

    <ItemGroup>
        <BootstrapperFile Include="Microsoft.Net.Framework.3.5.SP1" >
           <ProductName>.NET Framework 3.5 SP1</ProductName>
        </BootstrapperFile>
        <BootstrapperFile Include="Microsoft.Windows.Installer.3.1" >
           <ProductName>Windows Installer 3.1</ProductName>
        </BootstrapperFile>
    </ItemGroup>

    <Target Name="setup">
        <GenerateBootstrapper
            ApplicationFile="myproduct.msi"
            ApplicationName="myproduct"
            BootstrapperItems="@(BootstrapperFile)"
            Path="$(bootstrapperPackagesFolder)"
            ComponentsLocation="Relative"
            OutputPath="$(cddir)"
            Culture="en"/>
    </Target>

</Project>

In your case, the $(bootstrapperPackagesFolder) variable would point to C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\. The $(cddir) variable is the folder where you compose the content of your installation CD.

The GenerateBootStrapper task will not only generate a bootstrapper exe, but will also copy a DotNetFX35SP1 and a WindowsInstaller3_1 folder to the same location. During installation, the bootstrapper exe will look for those folders and use the files in there, rather than downloading them.

I'm not sure if my example is different from what you are already doing; maybe you just forgot to include the DotNetFX35SP1 folder on the installation CD?

Wim Coenen
After doing this, I get the following error:C:\Documents and Settings\hudson\.hudson\jobs\<Job>\workspace\<program>\main\SetupWiX\SetupWiX.wixproj(164,5): error MSB3152: The install location for prerequisites has not been set to 'component vendor's web site' and the file 'DotNetFX35SP1\dotNetFX20\aspnet.msp' in item '.NET Framework 3.5 SP1' can not be located on disk. See Help for more information.
mmr
also, it appears that the setup.bin in the boostrapper engine directory just doesn't find the proper directory for sp1, which is odd to me.
mmr
sorry, bootstrapper
mmr
Have you set the $(bootstrapperPackesFolder) variable, or set the Path attribute to where the bootstrapper packages can be found on your build server?
Wim Coenen
A: 

You could checkout this Microsoft sample code, the thing is that WiX does not provide a bootstrapper/chainer - that's not coming until WiX 3.5 as the "Burn" tool.

I'm not sure what you're using in your original example, I'm assuming msbuild or something - which is not a WiX component.

sascha