2008-11-10 58 views

回答

0

構建虛擬機,安裝Visual Studio,複製它(或創建差異虛擬HDD),然後在虛擬機下的調試器下運行安裝程序。

這就是我會做的(但我不是專家)。

+1

與System.Diagnostics.Debugger.Break()尖結合這和生活變得在生產調試的repros真的很好。 – stephbu 2008-11-11 06:49:10

4

連接安裝過程中調試 - 視覺工作室> Processes->附加或CTRL + ALT + P 設置斷點,你應該能夠去

+0

什麼是安裝程序(名稱?) – Sandeep 2015-07-16 22:31:07

42

東西是得心應手難的調試節代碼是

System.Diagnostics.Debugger.Break() 

會拋出任何已安裝的調試器(VStudio,WinDbg,遠程調試器等)捕獲的斷點。

用它來調試真正棘手的地區,其中常規F5 +去還是「附加到進程」是難以或無法執行,一些例子包括:

  • 短暫的過程
  • 時間敏感的過程
  • 闖入催生子進程
  • 安裝
  • 服務停止/啓動
  • 分佈SYSTE ms
+9

沒有爲我工作,首先在做System.Diagnostics.Debugger.Launch() – 2012-02-13 22:23:14

+1

嘿馬克 - 突破嘗試啓動在自動調試註冊表鍵指定的任何調試器。我可以想象,如果沒有調試器指定它什麼也不做 - 然後嘗試附加它 - 沒有結果。如果明確啓動它,則附加該實例。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb204634(v=vs.85).aspx有更多的細節。有一個隱藏的對話框用於指定默認調試器 - 此刻也逃脫了我。 – stephbu 2012-02-13 23:55:24

+1

這是我在這裏學到的最好的東西之一。 – 2016-03-11 03:57:16

1

我使用EventLog.WriteEntry(「source」,「message」),並在安裝時檢查EventLog。也許不是最佳的,但對我的作品:)

9

我發現最好的方法是編寫單元測試,以及新一輪上漲,並從你的單元測試初始化​​安裝程序類:

[TestClass] public class InstallerTest { 
[TestMethod] 
public void InstallTest() { 
    // substitute with your installer component here 
    DataWarehouseInstall installer = new DataWarehouseInstall(); 

    string assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

    string installLogFilePath = Path.Combine(assemblyDirectory, "install.log"); 
    installer.Context = new System.Configuration.Install.InstallContext(installLogFilePath, null);  

    // Refactor to set any parameters for your installer here 
    installer.Context.Parameters.Add("Server", "."); 
    //installer.Context.Parameters.Add("User", ""); 
    //installer.Context.Parameters.Add("Password", ""); 
    installer.Context.Parameters.Add("DatabaseName", "MyDatabaseInstallMsiTest"); 
    //installer.Context.Parameters.Add("DatabasePath", ""); 

    // Our test isn't injecting any save state so we give a default instance for the stateSaver 
    installer.Install(new Hashtable()); 
} } 

至少那麼它會更好地利用IDE工具。這對於具有很多組件的非常大的安裝程序特別有用。然後,您還可以創建有序的單元測試並按順序運行它們以在調試或自動構建過程中模擬安裝程序。

另一個提示是一般的SOLID/GRASS軟件原理......在整齊/薄層中開發,保持您的實際「自定義動作」安裝程序邏輯非常簡單,而不是調用任何可重用的API正如我們習慣於UI開發的安裝程序一樣。 (無論如何,安裝程序只是另一個用戶界面。)如果您的目標是在您的產品的所有安裝程序中共享某種UI體驗,那麼這尤其重要。

1

您還可以使用installUtil.exe實用程序來測試您的安裝程序組件。

如果您使用Installer類創建了ac#類程序集,請更改您的調試設置以啓動外部程序'C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe' ,然後輸入您的相應的命令行參數(例如/ Args = myargument「程序集路徑」)

當最後設置斷點時,按f5並設置爲調試代碼。 --paralax

1

我使用下面的類來寫一個簡單的日誌到目標目錄。在我看來,它比試圖使用Visual Studio調試器更簡單。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace MyCompany.Deployment 
{ 
    /// <summary> 
    /// Enables a quick and easy method of debugging custom actions. 
    /// </summary> 
    class LogFile 
    { 
     const string FileName = "MyCompany.Deployment.log"; 
     readonly string _filePath; 

     public LogFile(string primaryOutputPath) 
     { 
      var dir = Path.GetDirectoryName(primaryOutputPath); 
      _filePath = Path.Combine(dir, FileName); 
     } 

     public void Print(Exception ex) 
     { 
      File.AppendAllText(_filePath, "Error: " + ex.Message + Environment.NewLine + 
        "Stack Trace: " + Environment.NewLine + ex.StackTrace + Environment.NewLine); 
     } 

     public void Print(string format, params object[] args) 
     { 
      var text = String.Format(format, args) + Environment.NewLine; 

      File.AppendAllText(_filePath, text); 
     } 

     public void PrintLine() { Print(""); } 
    } 
} 
1

進行日誌記錄(3.5)關於使用什麼:

Context.LogMessage("My message"); 
9

驚訝實際上沒有人回答。將MessageBox.Show(「hello」)放入您的自定義操作的Install()成員中。在調試配置中構建部署。安裝。當MessageBox出現時,進入VS IDE,調試,附加進程並查找標有「Managed」的msiexec實例。將調試器附加到msiexec的該實例。現在返回到您的自定義操作的源代碼,並在調用MessageBox.Show()之後立即放置一個斷點。關閉MessageBox並且您的斷點將被擊中,並且您正在IDE中進行調試!

3

在您的安裝程序方法中添加Debugger.Launch()語句,該語句將啓動「Visual Studio及時調試程序」,您可以在其中附加Visual Studio實例並調試安裝程序類(MSI)。這也應該在Visual Studio 2010中工作。但是你需要有管理權限才能做到這一點。如果您沒有管理權限,則可能有問題。因此,請以管理員身份登錄以調試MSI。例如:

public override void Install(System.Collections.IDictionary stateSaver) 
{ 
    Debugger.Launch(); 
    base.Install(stateSaver); 

} 

在Visual Studio 2005,甚至Debugger.Break()使用工作,但不知何故,這並不與Visual Studio 2010

1

工作,編寫如下代碼在方法的開頭是要調試

#if DEBUG 
MessageBox.Show(Process.GetCurrentProcess().Id.ToString()); 
#endif 

所以,當你的方法被調用時,上面的代碼會被擊中,然後你可以將調試器使用上述過程ID的過程(CTRL + ALT + p)。您可能必須以提升的權限啓動VS。

0

你可以通過添加以下部分,無論是.csproj的或.csproj.user文件自動安裝項目的調試:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'"> 
    <StartAction>Program</StartAction> 
    <StartProgram>$(MSBuildBinPath)\installutil.exe</StartProgram> 
    <StartArguments>$(AssemblyName).dll</StartArguments> 
</PropertyGroup> 

使用的項目文件,如果你想其他開發人員從這一變化。用戶和文件,如果受益你想自己使用它。

1

以上都不適合我。這是實際工作的。請注意,您需要插入「兩個」行。

using System.Diagnostics; 

MessageBox.Show("Test is about to begin"); 
Debugger.Launch(); 
0

這實際上是爲我工作的。

System.Diagnostics.Debugger.Launch(); 

的安裝項目,並按然後右鍵點擊「安裝」