wixwindows-installerwix3.5installshield-2010

Wix created cub file


I have a problem where I create a cub file using wix which works fine however when I try and run it against a MSI created with InstallShield I get the following error:

Fatal schema conflict between CUB file and database. Unable to perform evaluation.

I have had a look at the schema in both the installshield msi and in the cub and it appears to be related to a few columns being long ints (4) in the cub and short ints (2) in the msi.

Is there a way to change how wix sets the schema on standard tables like media, file, CustomActions etc?

Or alternatively is there an automated way I can adjust the schema of an MSI like through a script?


Solution

  • I've written a C#/DTF ICE framework and I blogged about it at:

    MSI Tip: Authoring an ICE using C# / DTF

    The actual source code is available for download at:

    Authoring an ICE using C# / DTF

    WiX doesn't have a "CUB" element per say but I was able to get it 'close enough'. I rememeber an email exchange with Rob asking for official support in WiX but the response was neutral at best.

    Here's a snippet from the available source code:

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Product Id="c3252df2-a757-4874-8dc6-0e235f130818" Name="Cub" Version="1.0.0.0" Language="1033" Manufacturer="Cub">
        <Package InstallerVersion="200" Compressed="yes"/>
    
        <Binary Id="ICE" SourceFile="$(var.Tests.TargetDir)$(var.Tests.TargetName).CA.dll"></Binary>
    
        <CustomAction Id="ICE_DE_10" BinaryKey="ICE" DllEntry="ICE_DE_10"/>
        <CustomAction Id="ICE_DE_20" BinaryKey="ICE" DllEntry="ICE_DE_20"/>
    
        <CustomTable Id="_ICESequence">
          <Column Id="Action" PrimaryKey="yes" Type="string" Width="72" Category="Identifier" Description="Name of ICE action to invoke" Modularize="Column" />
          <Column Id="Condition" Type="string" Width="255" Nullable="yes" Category="Condition" Description="Optional expression which skips the ICE action if evaluates to expFalse."/>
          <Column Id="Sequence" Type="int" Width="2" Nullable="yes" MinValue="0" MaxValue="32767" Description="Number that determines the sort order in which the ICE actions are to be executed." />
          <Row>
            <Data Column="Action">ICE_DE_10</Data>
            <Data Column="Condition"></Data>
            <Data Column="Sequence">10</Data>
          </Row>
          <Row>
            <Data Column="Action">ICE_DE_20</Data>
            <Data Column="Condition"></Data>
            <Data Column="Sequence">20</Data>
          </Row>
        </CustomTable>
    
        <AdminUISequence>
          <CostInitialize Suppress="yes"/>
          <FileCost Suppress="yes"/>
          <CostFinalize Suppress="yes"/>
          <ExecuteAction Suppress="yes"/>
        </AdminUISequence>
    
        <AdminExecuteSequence >
          <CostInitialize Suppress="yes"/>
          <FileCost Suppress="yes"/>
          <CostFinalize Suppress="yes"/>
          <InstallValidate Suppress="yes"/>
          <InstallInitialize Suppress="yes"/>
          <InstallAdminPackage Suppress="yes"/>
          <InstallFiles Suppress="yes"/>
          <InstallFinalize Suppress="yes"/>
        </AdminExecuteSequence>
    
        <AdvertiseExecuteSequence>
          <CostInitialize Suppress="yes"/>
          <CostFinalize Suppress="yes"/>
          <InstallValidate Suppress="yes"/>
          <InstallInitialize Suppress="yes"/>
          <PublishFeatures Suppress="yes"/>
          <PublishProduct Suppress="yes"/>
          <InstallFinalize Suppress="yes"/>
        </AdvertiseExecuteSequence>
    
        <InstallUISequence>
          <CostInitialize Suppress="yes"/>
          <FileCost Suppress="yes"/>
          <CostFinalize Suppress="yes"/>
          <ValidateProductID Suppress="yes"/>
          <ExecuteAction Suppress="yes"/>
        </InstallUISequence>
    
        <InstallExecuteSequence>
          <CostInitialize Suppress="yes"/>
          <FileCost Suppress="yes"/>
          <CostFinalize Suppress="yes"/>
          <ValidateProductID Suppress="yes"/>
          <InstallValidate Suppress="yes"/>
          <InstallInitialize Suppress="yes"/>
          <InstallFinalize Suppress="yes"/>
          <PublishFeatures Suppress="yes"/>
          <PublishProduct Suppress="yes"/>
          <ProcessComponents Suppress="yes"/>
          <UnpublishFeatures Suppress="yes"/>
          <RegisterUser Suppress="yes"/>
          <RegisterProduct Suppress="yes"/>
        </InstallExecuteSequence>
    
      </Product>
    </Wix>
    

    Also I do the following as a post build event ( copy the MSI to CUB )

        <PostBuildEvent>copy "$(TargetPath)" "$(TargetDir)$(TargetName).cub"
    del "$(TargetPath)"</PostBuildEvent>