Dot-Net

Wix - 未安裝 .Net 框架時啟動瀏覽器到 .Net 框架下載 URL

  • July 23, 2021

我有一個安裝程序,它是從安裝項目創建並使用 MSBuild 使用此處找到的方法建構的。雖然我設置了生成過程以生成 .msi 文件,但我沒有設置項目本身。安裝項目的啟動條件之一是檢查 .Net 框架版本 4,如果目標電腦上未安裝,則會向使用者顯示一個消息框,詢問他們是否要訪問 URL 以下載.Net 框架安裝文件。如果使用者在消息框中選擇“是”,則啟動瀏覽器並載入 URL。好的。設置項目還檢查我們的產品需要的另一個先決條件並執行相同的操作。

我目前正在使用 Wix 重寫安裝程序,到目前為止,我已經能夠解決一些小問題(請記住,我仍處於整個安裝程序的早期階段)。我已經能夠為 .Net Framework v4.0 和其他必備軟體重新創建檢查。我還能夠顯示消息框,詢問使用者是否要啟動瀏覽器到 URL 以使用自定義 wix 操作下載其他必備軟體。

問題

想要對 .Net Framework 執行與舊安裝程序相同的操作,我編寫了另一個自定義操作來啟動瀏覽器到 .Net Framework 下載 URL。我編譯了自定義操作和安裝程序,並從我的測試機器中刪除了 .Net 框架。我在我的測試機器上執行了安裝程序,但自定義操作不起作用,這是由於 .Net Framework 不再安裝在測試機器上!

問題

有沒有辦法重新創建原始安裝項目能夠檢查 .Net 框架的方式,向使用者顯示一個消息框,然後如果使用者選擇這樣做,則啟動瀏覽器到下載 URL?我已經能夠確定是否沒有安裝框架,只需要一種顯示消息框的方法,如果使用者選擇並阻止安裝程序繼續,則啟動瀏覽器到特定的 URL。

或者

有沒有辦法在沒有安裝 .Net 框架的機器上執行自定義操作?(我猜這個問題的答案是否定的!)

一如既往,提前感謝

好的,經過長時間的調查和大量的試驗和錯誤,我能夠實現在某些系統資料庫項不存在時啟動預設 Web 瀏覽器的目標。

我首先在系統資料庫中檢查了所需的條目

<!--Property that indicates whether .Net framework 4.0 is currently installed-->
<Property Id="NETFRAMEWORK40">
 <RegistrySearch Id="NetFramework40" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
</Property>
<!--Property that indicates whether 2007 Office Data Connectivity is currently installed-->
<Property Id="ODCINSTALLED">
 <RegistrySearch Id="CheckODCVersion" Root="HKLM" Key="SOFTWARE\Classes\Installer\Products\000021091D0090400000000000F01FEC" Name="Version" Type="raw" />
</Property>   

然後,我將 WixUtilExtension 引用添加到項目中,並設置了以下 3 個自定義操作:

<CustomAction Id="SetExec1" Property="WixShellExecTarget" Value="http://go.microsoft.com/fwlink/?LinkID=186913" />
<CustomAction Id="SetExec2" Property="WixShellExecTarget" Value="http://www.microsoft.com/downloads/en/details.aspx?familyid=7554f536-8c28-4598-9b72-ef94e038c891&displaylang=en" />
<CustomAction Id="LaunchBrowser" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="ignore" />

前 2 個自定義操作用於設置將在不同時間使用的 WixShellExecTarget 屬性,最後一個自定義操作是使用 WixShellExec 實用程序啟動預設瀏覽器。

然後,我為我的安裝程序 UI 設置了 2 個自定義對話框,只有 2 個帶有簡短消息的簡單消息框以及“是”和“否”按鈕。以下只是其中一個消息框,因為它們的外觀非常相似:

 <Dialog Id="NetFRWDlg" Width="260" Height="95" Title="[ProductName] Installation" NoMinimize="yes">

   <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="40">
     <Text>This setup requires the .NET Framework version 4.0. Please install the .NET Framework and run this setup again. The .NET Framework can be obtained from the web. Would you like to do this now?</Text>
   </Control>

   <Control Id="YesButton" Type="PushButton" X="72" Y="67" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Yes]">
     <Publish Event="DoAction" Value="SetExec1" Order="1">1</Publish>
     <Publish Event="DoAction" Value="LaunchBrowser" Order="2">1</Publish>
     <Publish Event="EndDialog" Value="Exit" Order="3">1</Publish>
   </Control>

   <Control Id="NoButton" Type="PushButton" X="132" Y="67" Width="56" Height="17" Default="no" Cancel="yes" Text="[ButtonText_No]">
     <Publish Event="EndDialog" Value="Exit">1</Publish>
   </Control>

   <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="[WarningIcon]" />
 </Dialog>

然後我將這 2 個對話框添加到 InstallUISequence 表中:

 <InstallUISequence>
   <Show Dialog="NetFRWDlg" After="AppSearch">
     (NOT Installed) AND (NOT NETFRAMEWORK40)
   </Show>
   <Show Dialog="ODCDlg" After="AppSearch">
     (NOT Installed) AND (NOT ODCINSTALLED)
   </Show>
   <Show Dialog="Install_PAGE1" After="CostFinalize" />
 </InstallUISequence>

為了簡要說明這一切是如何結合在一起的,當安裝程序啟動時,它將使用 NETFRAMEWORK40 和 ODCINSTALLED 屬性檢查所需的系統資料庫。在 InstallUISequence 期間,如果缺少這些系統資料庫,將顯示 NetFRWDlg 或 ODCDlg 對話框/消息框。然後,使用者可以通過點擊對話框/消息框的“是”按鈕來選擇啟動預設瀏覽器以查看傳入的 URL。在此過程中,設置 WixShellExecTarget 屬性、啟動預設瀏覽器和退出安裝程序的一系列操作將執行。如果使用者點擊否,則安裝程序將簡單地退出。

引用自:https://stackoverflow.com/questions/7823837