2011-02-17 56 views
1

我有,我创建使用威克斯但是当我尝试运行它针对MSI使用InstallShield创建我收到以下错误,工作正常崽文件问题:维克斯创建崽文件

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

我有查看了installshield msi和cub中的模式,并且它似乎与少数几列是长整型(4)和msi中的短整型(2)有关。

有没有办法改变wix如何在标准表上设置模式,如媒体,文件,CustomActions等?

或者,有没有一种自动化的方式可以通过脚本调整MSI的模式?

+0

对不起,我没有真正回答这个问题。速度阅读:-( – 2011-02-18 03:02:53

回答

1

我写了一个C#/ DTF ICE框架和我的博客上讲述它在:

MSI Tip: Authoring an ICE using C#/DTF

实际的源代码可从以下地址下载:

Authoring an ICE using C#/DTF

维克斯没有一个“CUB”元素说,但我能够“足够接近”。我记得与Rob的电子邮件交换,要求在WiX的官方支持,但答复是最好的。

下面是可用的源代码片段:

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

此外,我的作为后生成事件以下(微星复制到CUB)

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

感谢您回复我。您的博客文章是我开始创建CUB的地方:)。除了当我尝试运行由InstallShield创建的msi的CUB文件时,它的工作原理非常完美,因为msi的架构看起来略有不同。你不会碰巧知道如何改变模式本身吗?我曾尝试使用自定义表来定义引起问题的内置表,但它只是恢复为默认值。 – Wil 2011-02-17 23:18:06

+0

因为你的博客文章给了我最初的解决方案,所以给你答案的答案:)。在wix中构建ICE验证脚本。 :) – Wil 2011-02-18 00:59:36

0

下面的脚本修复问题。它出现Wix创建一个媒体和文件表,Windows安装程序不喜欢如果架构不同。所以简单的解决方案是在wix创建后期文件作为后期构建操作后删除两个表。

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