2011-08-30 68 views
4

我有一個自定義操作,通過Windows安裝程序添加/刪除受信任的根證書中的證書。我通過實現這一CustomAction如何取消並回滾VS2010 Windows Installer中的自定義操作?

這有可能是用戶可能沒有權限證書添加到TrustedRoots,或者他們可以選擇「取消」,我怎麼回滾以前的行爲,並告訴安裝程序,我取消了這個過程?

現在,Windows Installer始終報告成功響應,即使失敗。

+0

我有興趣瞭解如何在安裝程序中添加/刪除證書,如果您不介意的話。 – jp2code

+1

@ jp2code只要系統允許我登錄,我就會立即發佈到http://xbapcertsetup.codeplex.com(codeplex今天有問題嗎?) – LamonteCristo

回答

6

你必須讓你的自定義操作的一個函數的返回類型的ActionResult這樣你可以返回的故障類型,如果取消或發生其他異常。

using Microsoft.Deployment.WindowsInstaller; 
namespace CustomAction1 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult ActionName(Session session) 
     { 
      try 
      { 
       session.Log("Custom Action beginning"); 

       // Do Stuff... 
       if (cancel) 
       { 
        session.Log("Custom Action cancelled"); 
        return ActionResult.Failure; 
       } 

       session.Log("Custom Action completed successfully"); 
       return ActionResult.Success; 
      } 
      catch (SecurityException ex) 
      { 
       session.Log("Custom Action failed with following exception: " + ex.Message); 
       return ActionResult.Failure; 
      } 
     } 
    } 
} 

注意:這是一個WIX兼容的自定義操作。我發現WIX可以更好地控制MSI的創建。

+0

-1 ..我不認爲這適用於產生MSI的Windows安裝項目。我沒有使用MVC,也沒有使用任何與網絡相關的技術。我誤解了嗎? – LamonteCristo

+0

@ makerofthings7:我們使用這個爲我們的Wix創建MSI安裝程序。它不限於MVC或網絡相關技術。但是,它需要安裝wix:http://www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html –

+3

@ makerofthings7:這是wix兼容的自定義操作。沒有在您的問題中看到有關Windows安裝項目的具體提及。 –

2

這隻能通過返回1602從win32 DLL或VBScript自定義操作完成。如果您使用EXE或安裝程序類操作,則任何非零返回值都將被視爲失敗。

+0

我正在尋找示例代碼。我重寫什麼來運行我的自定義代碼?在重寫中,我是否在代碼之前或之後調用'BaseObject.OverrideAction()'? – LamonteCristo

+0

覆蓋由安裝程序類操作使用。您需要一個win32 DLL或VBScript自定義操作。您可以在這裏找到一個C++ DLL自定義動作教程:http://www.codeproject.com/KB/install/msicustomaction.aspx –

+1

我是一位.NET開發人員,他爲我的開發人員提供了分散的MSFT文檔。我發現很難相信win32或VB腳本是* only *的方式......我對C#感興趣的方式 – LamonteCristo

3

嘗試拋出InstallException。在這種情況下,安裝程序將檢測到安裝和回滾操作錯誤。

public override void Commit(IDictionary savedState) 
    { 
     base.Commit(savedState); 
     Console.WriteLine("Commit ..."); 
     // Throw an error if a particular file doesn't exist. 
     if(!File.Exists("FileDoesNotExist.txt")) 
     throw new InstallException(); 
     // Perform the final installation if the file exists. 
    } 
+0

我應該在哪裏拋出這個異常? (在哪個重寫?)我應該在我的自定義代碼之前還是之後調用'Base.SomeAction()'? – LamonteCristo

+0

我不確定在您的代碼中,但可能在您驗證權限的位置(如果您的自定義代碼中包含此類部分),或者在添加證書失敗之後捕獲異常。如[此處](http://msdn.microsoft.com/en-us/library/system.configuration.install.installexception.aspx)所述,可以在任何重寫事件上引發此異常。 – Samich

+0

這是完美的。你能告訴我什麼是在拋出InstallException時調用的嗎?應用程序是「卸載」還是必須具有清理功能? – LamonteCristo

相關問題