Question

J'ai un problème où je crée un fichier Cub en utilisant WIX qui fonctionne bien mais lorsque j'essaie de l'exécuter contre un MSI créé avec InstallShield, j'obtiens l'erreur suivante:

Conflit de schéma mortel entre le fichier Cub et la base de données. Impossible d'effectuer une évaluation.

J'ai jeté un coup d'œil au schéma dans le MSI InstallShield et dans le Cub et il semble être lié à quelques colonnes étant longues (4) dans le Cub et les INTS courts (2) dans le MSI.

Existe-t-il un moyen de modifier la façon dont WIX définit le schéma sur des tables standard comme les médias, le fichier, les personnalisations, etc.?

Ou alternativement, y a-t-il une façon automatisée de régler le schéma d'un MSI comme via un script?

Était-ce utile?

La solution

J'ai écrit un cadre de glace C # / DTF et j'ai blogué à ce sujet à:

Astuce MSI: rédaction d'une glace en utilisant C # / DTF

Le code source réel est disponible en téléchargement sur:

Autorisation d'une glace en utilisant C # / DTF

Wix n'a pas d'élément "Cub" par mot à dire, mais j'ai pu le rapprocher. Je me souviens d'un échange de courriels avec Rob demandant un soutien officiel à Wix, mais la réponse était au mieux neutre.

Voici un extrait du code source disponible:

<?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>

Je fais également ce qui suit en tant qu'événement de build (copiez le MSI à Cub)

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

Autres conseils

Le script suivant résout le problème. Il semble que Wix crée un support et une table de fichiers que Windows Installation n'aime pas si le schéma est différent. La solution simple consiste donc à supprimer les deux tables après que Wix ait créé le fichier Cub en tant qu'action de build post.

Const msiOpenDatabaseModeTransact = 1

Dim installer
Dim db
Dim view
Set installer = CreateObject("WindowsInstaller.Installer")
Set db = installer.OpenDatabase("Wix\Release\UnitTest.cub", msiOpenDatabaseModeTransact)
Set view = db.OpenView("DROP TABLE `File`")
view.Execute
view.close

Set view = db.OpenView("DROP TABLE `Media`")
view.Execute
view.close

Set view = nothing
db.commit
Set db = nothing
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top