7

在過去,我們使用高級安裝程序爲特定項目構建.msi安裝程序。我們每年的高級安裝許可已過期,因此爲了避免續訂成本,並且因爲我認爲使用Visual Studio可以實現同樣的目標,所以我嘗試使用Visual Studio 2010安裝項目來構建我的.msi自定義操作不起作用 - Visual Studio安裝項目

大部分情況下,我用Visual Studio構建的安裝程序工作正常。但是,我們需要安裝程序執行的一件事是運行幾個.reg文件以將大量設置添加到註冊表中(可能值得注意的是,這是舊軟件,它只是在維護和更新之前一直存在將在不久的將來被完全取代,改變我們存儲設置的方法是不切實際的)。使用高級安裝程序,我們能夠執行一個.cmd文件作爲「安裝」自定義操作,該操作將運行這些.reg文件,這些文件也包含在安裝中。 VS安裝項目有自定義操作,但現在看來,在這裏,他們需要是要麼.dll文件的.exe文件,所以我必須找到一個替代使用.BAT.CMD文件。

首先,我嘗試添加一個命令行項目,我的解決方案,僅包括在main()方法,下面幾行:

using (Process registryInput = Process.Start("regedit.exe", "/s Settings1.reg")) 
{ 
    registryInput.WaitForExit(); 
} 

using (Process registryInput= Process.Start("regedit.exe", "/s Settings2.reg")) 
{ 
    registryInput.WaitForExit(); 
} 

我加入這個項目的主輸出的「安裝」 「自定義操作」編輯器的文件夾。試圖運行安裝程序,但命令行過程似乎從未運行,也沒有安裝註冊表設置。如果我手動從安裝它的應用程序目錄運行命令行可執行文件,它會按照預期添加註冊表項 - 所以問題不在於我用來調用.reg文件的代碼。

我轉向MSDN並更改我的解決方案,將其模擬爲Custom Actions Walkthrough。我創建了一個類庫項目(並刪除了我的命令行項目)並添加了一個安裝程序類。我們沒有在Commit()方法中使用Microsoft的網站URL來啓動瀏覽器,而是將其代碼添加到了Install()方法中。以下是我結束了:

[RunInstaller(true)] 
public partial class Installer1 : System.Configuration.Install.Installer 
{ 
    public Installer1() 
    { 
     InitializeComponent(); 
    } 

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] 
    public override void Install(IDictionary stateSaver) 
    { 
     base.Install(stateSaver); 

     using (Process registryInput = Process.Start("regedit.exe", "/s Settings1.reg")) 
     { 
      registryInput.WaitForExit(); 
     } 

     using (Process registryInput = Process.Start("regedit.exe", "/s Settings2.reg")) 
     { 
      registryInput.WaitForExit(); 
     } 
    } 

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] 
    public override void Commit(IDictionary savedState) 
    { 
     base.Commit(savedState); 
    } 

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] 
    public override void Rollback(IDictionary savedState) 
    { 
     base.Rollback(savedState); 
    } 

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] 
    public override void Uninstall(IDictionary savedState) 
    { 
     base.Uninstall(savedState); 
    } 
} 

我加入這個新的類庫項目的主輸出的「自定義操作」編輯器的「安裝」文件夾中。但是,當我運行安裝程序時,代碼似乎不會被執行,並且我的註冊表設置不會被添加。我曾嘗試將此安裝程序設置爲「爲所有用戶安裝」和「僅限此用戶」。

任何幫助,以獲得此自定義操作工作或替代方法來獲取.reg文件安裝上運行將不勝感激。先謝謝你。

+4

您可以使用'cmd.exe/c .cmd'運行.cmd或.bat文件。 – 2011-06-01 18:28:09

+3

嘗試使用詳細日誌記錄運行安裝:'msiexec/i product.msi/l * vx product.log'。該日誌文件將具有用於執行自定義操作的命令行。 – 2011-06-01 18:31:16

+0

至少在VS2005中,它不會讓你輸入「cmd.exe/c .cmd」作爲運行命令,你必須從文件夾瀏覽器中選擇文件:( – gollumullog 2011-07-12 21:02:54

回答

5

我剛剛遇到了同樣的問題,re:自定義操作沒有被安裝程序拾取。解決方案是以管理員身份運行Visual Studio。

即使我是我的機器上的完整管理員沒有任何限制(AFAIK),安裝程序將永遠不會拿起自定義操作。只要關閉Visual Studio,然後以管理員身份重新啓動(右鍵單擊>以管理員身份運行),安裝程序會立即收到自定義操作。

+5

謝謝,你只是爲我節省了一臺新顯示器的成本。它。 – 2011-06-22 00:25:26

相關問題