2016-11-04 47 views
0

我使用WiX安裝程序爲我的C#應用​​程序創建了一個安裝程序。無法使用WiX安裝程序進行設置

我使用類CustomAction安裝SQL數據庫並將權限設置爲文件夾。

有我的課:

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult AllowAppData(Session session){...} 

    [CustomAction] 
    public static ActionResult Install_SetupDataBase(Session session){...} 
} 

而且product.wxs:

<Binary Id="CASetup.dll" SourceFile="$(var.SetupCustomAction.TargetDir)$(var.SetupCustomAction.TargetName).CA.dll" /> 
<CustomAction Id="CustomActionSetupAllow" BinaryKey="CASetup.dll" DllEntry="AllowAppData" Execute="immediate" /> 
<CustomAction Id="CustomActionSetupBase" BinaryKey="CASetup.dll" DllEntry="Install_SetupDataBase" Execute="immediate" /> 

<InstallExecuteSequence> 
    <Custom Action='CustomActionSetupAllow' After='InstallFinalize' /> 
    <Custom Action='CustomActionSetupBase' After='InstallFinalize' /> 
</InstallExecuteSequence> 

構建是好的,但是當安裝完成我的消息:

enter image description here

我試過只有CustomActionSetupAllow它的作品fin即但與CustomActionSetupBase我收到了消息。

我怎麼知道DLL丟失了?我應該在哪裏添加參考?

回答

2

錯誤「無法運行」並不意味着它缺失。它位於MSI文件的二進制表格中,並將流式傳輸到磁盤上運行。該錯誤意味着它不會加載並運行,或者正在崩潰。有可能缺少依賴的Dll。

一個潛在的嚴重問題是您已將自定義操作(CA)標記爲即時。這意味着它會在安裝任何東西之前運行,例如可能會填充的空數據庫以及它可能需要的任何依賴的Dll。除此之外,如果您使用直接CA創建SQL DB,並且安裝隨後失敗,那麼您將擁有一個數據庫,但沒有安裝產品。它應該是延遲自定義操作,理想情況下使用回滾CA刪除數據庫,以便用戶可以再次運行安裝,並且不會再次填充相同的數據庫,如果這是問題。

還有其他地方你可能想看看。即時CA與安裝用戶的憑證一起運行,因此如果代碼需要提升,則會失敗。延遲的CA將隨系統帳戶一起運行,因此使用系統帳戶訪問SQL DB可能會成爲問題。 CA中的代碼需要非常防禦,因爲它與交互式測試不一樣。由於這些原因,最好是在應用程序第一次運行時使用在真正的交互式環境中運行的啓動程序來執行此操作。

+0

我已將自定義操作標記爲'After ='InstallFinalize''。這兩個自定義操作都在同一個文件中。當我只調用'CustomActionSetupAllow'時它很好用,但只有'CustomActionSetupBase'有錯誤。我在第一行插入了一個斷點,它不會中斷。潛在缺少DLL是在安裝項目還是在自定義操作項目中? –

+0

該死的我很愚蠢......我沒有看到我在CustomActionSetupBase之前移除了標誌'[CustomAction]'。我爲這個錯誤浪費了很多時間。但很高興知道,如果該標誌不存在,則可能發生此錯誤。謝謝你的幫助 –