簡體   English   中英

WiX Condition可在MSI中使用,但不能在捆綁軟件中使用

[英]WiX Condition works in MSI but not in Bundle

在構建MSI文件時,如果使用了基本條件,就會發生預期的情況。 例如,假設我在安裝文件中有此文件:

<Property Id="myProperty" Value="0"/>
<Condition Message="Value of myProperty is [myProperty], and it should be 1.">
    <![CDATA[Installed OR myProperty = "1"]]>
</Condition>

如果我構建此文件並運行MSI文件,則它可以工作-也就是說,它顯示錯誤消息並退出。

運行MSI時的工作條件

但是,如果我將MSI放入捆綁包中,它將不起作用。 也就是說,當我將其放入Bootstrapper中時(下面的“屬性”是我的安裝項目的名稱-我知道是不好的名字):

    <Chain>
       <MsiPackage SourceFile="$(var.Properties.TargetPath)"/>
    </Chain>

然后運行安裝文件,出現錯誤。 安裝開始時,它會檢查條件,並向我顯示預期的消息框(與上面相同),然后出現以下錯誤消息:

設置失敗

查看日志,我得到三個錯誤消息:

Error 0x80070643: Failed to install MSI package. 
Error 0x80070643: Failed to execute MSI package. 
Error 0x80070643: Failed to configure per-machine MSI package.

使用退出代碼:

Exit code: 0x643, restarting: No

我是WiX的新手,我什至不知道如何去研究問題所在-我什至不能問一個聰明的問題。 因此,我正在與您聯系!

(我正在使用WiX 3.10和Visual Studio 2015)

編輯:

謝謝你回到我身旁! 我嘗試了您的建議:

在安裝程序文件中,我將該屬性公開,並使其安全。 我保留了相同的條件,並且由於我不認為應該在此獲取值而不是在引導程序中獲取值,因此我將該屬性的值省略了。 這是我為屬性/條件編寫的代碼:

<Property Id="MY_PROPERTY" Secure="yes"/>
<Condition Message="MY_PROPERTY is [MY_PROPERTY].  Should be 1">
    <![CDATA[Installed OR MY_PROPERTY = "1"]]>
</Condition>

然后,在boostrapper文件中,添加的子元素並為其提供值:

<MsiPackage SourceFile="$(var.LCondErrorInstaller.TargetPath)">
    <MsiProperty Name="MY_PROPERTY" Value="0"/>
</MsiPackage>

當我運行它時,我得到的行為幾乎與以前相同,只是有一個區別-當我收到錯誤消息時。 這次,我得到了帶有“消息”條件和與以前相同的錯誤消息的彈出屏幕(請參閱上面的“安裝失敗”),除了這次我得到的消息是在安裝的后期發生的,這使我認為條件實際上是在引導程序中觸發的。

至於日志文件,它們看起來是一樣的(我不確定運行Burn文件時如何獲取MSI的日志文件,我現在要做的只是運行帶有“ / l”標志的Burn文件,例如因此:> file.exe / l logFile.log )。

為了清楚起見,以下是日志文件中似乎很重要的部分:

    Error 0x80070643: Failed to install MSI package.
    Error 0x80070643: Failed to execute MSI package.
    Error 0x80070643: Failed to configure per-machine MSI package.
    ...
    Exit code: 0x643, restarting: No

當我最初詢問有關我正在尋找哪種行為的問題時,我應該更具體一些。

在Burn文件中,我將不僅擁有一個MSI文件。 我想做的是: 安裝Burn文件時,如果其中一個MSI文件中有一個條件不滿足,我希望該MSI文件根本不被安裝,其余的MSI被安裝。 我不在乎UI。

如果有另一種方法可以做到,我全都聽着。

如果您在MSI中具有啟動條件,則可以將這些啟動條件復制或移動到引導程序包本身中,以停止這種類型的行為。

啟動條件失敗返回致命錯誤1603(十六進制的0x643),這是我期望的,當引導程序啟動的MSI由於不滿足啟動條件而失敗時,我會看到這種錯誤。

您應該在msi的日志中看到類似的內容

Action ended 17:33:38: LaunchConditions. Return value 3.
MSI (c) (08:4C) [17:33:38:610]: Doing action: FatalError
Action 17:33:38: FatalError. 
Action start 17:33:38: FatalError.
...
MSI (c) (08:4C) [17:33:41:188]: MainEngineThread is returning 1603


詳細說明,您必須將msi軟件包定義更改為以下內容,以使其在引導程序中正常運行

<Chain>
   <MsiPackage SourceFile="$(var.Properties.TargetPath)">
      <MsiProperty Name="MYPROPERTY" Value="1"/>
   </MsiPackage>
</Chain>

此外,如果要將屬性從引導程序傳遞到MSI,則該屬性必須是公共屬性,該屬性的名稱為ALL CAPS。

如果要在msi的“安裝”階段中的某個位置使用此屬性,則還必須將該屬性標記為安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM