簡體   English   中英

WiX安裝程序在靜音和“正常”模式下啟動相同的自定義操作

[英]WiX Setup launching same custom action in silent and “normal” mode

我需要創建一個設置來啟動自定義操作,配置一些SQL的東西。

這是我的順序:

<InstallExecuteSequence>
  <Custom Action='StartCustomAction' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>

在這里,我稱之為自定義操作:

<Fragment>
  <Binary Id="CustomActionBinary" SourceFile="$(var.InfPro.dotigaRuntimeSetup.CustomActions.TargetDir)$(var.InfPro.dotigaRuntimeSetup.CustomActions.TargetName).CA.dll"/>
  <CustomAction Id="StartCustomAction" BinaryKey="CustomActionBinary" DllEntry="ShowInitialForm" Execute="immediate" Return="check"/>
</Fragment>

這是我的自定義操作:

[CustomAction]
public static ActionResult ShowInitialForm(Session session)
{

   int i = Convert.ToInt32(session["UILevel"]);
   if (i == 2)
   {
       StreamWriter file = new StreamWriter("c:\test.txt");
       file.WriteLine("Test");

       file.Close();
        }
   else { 
       InitialForm f = new InitialForm();
       if (f.ShowDialog() == DialogResult.Cancel)
          return ActionResult.UserExit;
       }
       return ActionResult.Success; 
}

重要的部分是if-block。 出於測試目的,我想創建一個文件,並在靜默執行安裝程序時在其中寫入“Test”。 據微軟稱,UILevel屬性應為2. https://msdn.microsoft.com/en-us/library/windows/desktop/aa372096(v=vs.85).aspx

不幸的是沒有發生。 我甚至不知道自定義操作是否被調用。

我訪問了http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html ,看到你可以在自定義動作標簽中使用DllEntry =“WixSilentExec”,但據我所知,DLL條目的名稱是您的自定義操作方法。 在我的例子中ShowInitialForm。

謝謝你的幫助。 ;)

感謝您的所有幫助,但解決方案完全是另一種方式。 我使用以下命令在安靜模式下調用我的設置:

msiexec /i mySetup.msi /l*v myLog.log 

該日志長達1700行,偶然我發現導致安裝失敗的錯誤是錯誤1925,這意味着“您沒有足夠的權限為該機器的所有用戶完成此安裝。以管理員身份登錄然后重試這個裝置。“

所以我通過命令行以管理員身份啟動了設置,一切正常。

您在二進制元素中引用(您的自定義操作項目).CA.dll 您應該參考(您的自定義操作項目).dll

根據您的自定義操作位置,它應該是延遲類型CA,但您使用的是直接類型CA. 此時不會立即調用直接CA. 將您的操作類型更改為延遲。 請注意,延遲操作無法訪問會話變量。 這樣做是為了將數據傳遞給您的CA:

<CustomAction Id="SetProperty.StartCustomAction" Property="StartCustomAction" Value="UILevel=[UILevel]" />
<CustomAction Id="StartCustomAction" BinaryKey="CustomActionBinary" DllEntry="ShowInitialForm" Execute="deferred" />

應該定義在執行序列中的StartCustomAction之前調用SetProperty.StartCustomAction CA:

<Custom Action='SetProperty.StartCustomAction' After='InstallFinalize'>NOT Installed</Custom>
<Custom Action='StartCustomAction' After='SetProperty.StartCustomAction'>NOT Installed</Custom>

在您的操作代碼中使用此代碼來訪問傳遞的值:

session.CustomActionData["UILevel"]

使用PhilDW建議並始終使用日志輸出運行。 使用這樣的代碼寫入以記錄您的調試輸出:

session.Log("Begin ShowInitialForm CustomAction");

希望這可以幫助。

使用命令行msiexec / I [msi的路徑] / l * vx [文本日志文件的路徑]安裝,看看發生了什么。 它將顯示UILevel屬性的值。 此外,日志將告訴您安裝是否嘗試完全調用您的Dll。 session.log調用作為代碼中的第一件事將告訴您代碼是否已啟動(您的文本將出現在該MSI日志中)。 根據需要執行盡可能多的session.log調用,以查看它是否失敗以及失敗的位置。

您不能假設它找不到Dll,因為問題可能是缺少依賴Dll。 您在顯示Dll時發布的png文件 - 目前尚不清楚要顯示的內容。 Dll位於MSI文件的二進制表中,並將流式傳輸到將被調用的某個位置,因此根據定義,它們不會丟失。 二進制表中的Dll未被“安裝”以被稱為CA - 它們被流式傳輸,調用,然后被移除。 png文件顯示臨時位置並不明顯。 在調用托管代碼自定義操作的WiX / DTF方法中有一些分層,也許你看錯了地方。

希望您的對話框能夠在WiX / DTF托管代碼自定義操作體系結構中工作,因為您需要在具有功能消息循環的STA窗口線程中。 從架構上講,這些數據應該在開始時在UI中收集,如果UI被抑制,那么在UI中設置的屬性值可以通過msiexec命令行傳遞,因此安裝仍然可以完成所有操作(並且您需要沒有UILevel檢查)。 另一個常見的替代方法是在第一次使用應用程序時運行該程序,因為您正在運行一個普通的,可調試UI的可測試程序。 作為另一種選擇,只需將實際程序作為exe自定義操作運行,這也是一個普通的UI程序,可測試,可調試等。

暫無
暫無

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

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