2015-05-26 63 views
0

我完成了我的軟件,但無法找到創建其設置的正確方法。在設置期間啓動Msiexec的自定義操作

我搜索了網頁,在這裏,但我發現只有舊的後期引用舊的視覺工作室版本。

正如我在VS 2013社區版中所知道的,我有一個有限的Installshield插件,我也能夠下載Visual Studio Installer插件。創建一個簡單的設置是相對容易的,但我需要在安裝過程中靜默安裝一個小軟件。該軟件是雙重間諜(微軟代理的更新版本)和開發人員建議啓動安裝了這種方式:

只需運行:

msiexec /i DoubleAgent_x86.msi /qb-! 

您在安裝過程中(我認爲最好的地方應該是Commit事件)。

順便說一下,它不可能啓動.msi安裝程序與行動,我真的不明白創建自定義操作的最佳做​​法。

我讀了一些關於創建類的內容,但大多數文章都提到了Visual Studio 2008或Wix插件。我正在尋找一種在Visual Studio Installer或installshield中使用Msiexec的方法。

編輯:我發現這個解決方案,它的工作這麼好:https://msdn.microsoft.com/it-it/library/vstudio/d9k65z2d%28v=vs.100%29.aspx

這是一個在意大利,但很容易轉化成原來的語言(英語)與右上方的單選按鈕。它與Visual Studio安裝插件和VS社區版2013完美配合。

我目前沒有代碼發佈,因爲我只構建了他們的示例,但我會盡快發佈它,因爲msiexec用於隱藏安裝。

我創建了一個測試的WinForm項目,我添加了安裝程序類與此代碼:

 [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] 
 
     public override void Commit(IDictionary savedState) 
 
     { 
 
      base.Commit(savedState); 
 
      // Use ProcessStartInfo class 
 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
 
      startInfo.CreateNoWindow = false; 
 
      startInfo.UseShellExecute = false; 
 
      startInfo.FileName = "msiexec.exe"; 
 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
 
      startInfo.Arguments = "/i DoubleAgent.msi /qb-!"; 
 

 
      try 
 
      { 
 
       // Start the process with the info we specified. 
 
       // Call WaitForExit and then the using statement will close. 
 
       using (Process exeProcess = Process.Start(startInfo)) 
 
       { 
 
        exeProcess.WaitForExit(); 
 
       } 
 
      } 
 
      catch 
 
      { 
 
       // Log error. 
 
      } 
 
     }

我開了與Visual Studio安裝程序的設置。在主設置結束時,開始說有另一個安裝,但雙重代理不安裝。

再次編輯:我沒有管理權限來默默執行msiexec。我認爲,因爲Double Agent設置需要管理員權限。我不想使用清單來提升權限,那麼我認爲唯一的解決方案是顯示DoubleAgent安裝程序(如果是最小輸出的話)。

順便說我有這樣的代碼在形式上1按鈕的工作:

private void button1_Click(object sender, EventArgs e) 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.CreateNoWindow = true; 
    startInfo.UseShellExecute = false; 
    startInfo.FileName = "msiexec.exe"; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.Arguments = "/i DoubleAgent.msi /qn"; 

    try 
    { 
     // Start the process with the info we specified. 
     // Call WaitForExit and then the using statement will close. 
     using (Process exeProcess = Process.Start(startInfo)) 
     { 
      exeProcess.WaitForExit(); 
      MessageBox.Show("Finish"); 
     } 
    } 
    catch 
    { 
     // Log error. 
    } 
} 

但是,同樣的代碼在安裝過程中不起作用。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

對不起約翰......感謝您的幫助 –

回答

0

這不起作用!一個MSI安裝程序無法啓動另一個MSI安裝程序。當它說「另一個安裝正在進行中」時,它指的是已經運行的那個。這不是關於管理員權限 - 無論開發人員說什麼,您都無法從安裝程序自定義操作中安裝另一個MSI。

一般來說,這是bootstrappers的用途,在安裝主MSI之前安裝先決條件。這就是爲什麼甚至VS安裝程序讓你在安裝MSI之前生成一個setup.exe來安裝必備軟件(其中許多是基於MSI的)。

因此,您需要找出將安裝該MSI的引導程序(不知道InstallShield LE是否有)。過去有一種名爲Bootstrap Manifest Generator的工具,您可以使用它來定製setup.exe以安裝像您的那樣的自定義prerequisiyes。或者你可以使用WiX的引導程序安裝MSI,然後安裝你的MSI。或者您可以將該MSI複製到系統中,並讓您的應用程序在首次使用時安裝它。

或者,也許該代理軟件可用作合併模塊,在這種情況下,您只需將合併模塊添加到您的MSI版本。