2008-11-10 8 views

Respuesta

0

compilar una VM, instalar Visual Studio, hacer una copia de la misma (o crear una HDD virtual de diferenciación) y ejecutar el instalador debajo del depurador en la máquina virtual.

Eso es lo que haría (pero no soy un experto).

+1

combinar esto con la punta System.Diagnostics.Debugger.break() y la vida se pone muy buenos para producir repros depurables. – stephbu

4

adjuntar el proceso de instalación de Visual Studio en Debug-> procesos-> Agregar o CTRL + ALT + P establece el punto de interrupción y usted debería ser capaz de ir

+0

¿Y cuál es el proceso de instalador (nombre?) – Sandeep

42

Algo que es muy útil para difícil de secciones de depuración código es

System.Diagnostics.Debugger.Break() 

arrojará un punto de interrupción capturado por cualquier depurador instalado (VStudio, WinDbg, depurador remoto etc ...).

usa para depurar las zonas muy difíciles donde F5 regulares + Go o "conectar con el proceso" es difícil o imposible de realizar, algunos ejemplos incluyen:

  • procesos de breve duración
  • procesos sensibles al tiempo
  • rompiendo en sub-procesos generados
  • instaladores
  • parada de servicio/iniciar
  • syste distribuido ms
+9

No funcionó para mí, sin hacer primero System.Diagnostics.Debugger.Launch() –

+1

Hey Mark - Break intenta ejecutar el depurador que se especifique en las claves de depuración automática Reg. Me imagino que si no hay un depurador especificado, no haría nada, entonces intenta adjuntarlo, no dará resultado. Donde al lanzarlo explícitamente adjuntas esa instancia. http://msdn.microsoft.com/en-us/library/windows/desktop/bb204634(v=vs.85).aspx tiene más detalles. Hubo un diálogo enterrado para especificar el depurador predeterminado también - se me escapa en este momento. – stephbu

+1

Esta es una de las mejores cosas que he aprendido aquí. –

1

Uso EventLog.WriteEntry ("fuente", "mensaje") y compruebo el EventLog durante la instalación. Tal vez no es óptima, pero funciona para mí :)

+0

Haría lo mismo ... escriba para iniciar sesión y verifique el registro una vez que la aplicación haya terminado de ejecutarse, así que tenga una idea clara de lo que está sucediendo ... ¡afirmando el hecho de que es lo suficientemente pedante! – IbrarMumtaz

9

La mejor manera que he encontrado es la de escribir una prueba de unidad, y el nuevo y inicializar la clase de instalación de su unidad de prueba:

[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()); 
} } 

Al menos luego aprovecha mejor las herramientas IDE. Esto es especialmente útil para instaladores muy grandes con MUCHOS componentes. Luego, también puede crear pruebas unitarias ordenadas y ejecutarlas en secuencia para imitar su instalador durante la depuración o sus compilaciones automáticas.

Otro consejo serían los principios generales del software SOLID/GRASS ... desarrollar en capas ordenadas/delgadas, manteniendo su lógica de instalador de "acción personalizada" muy simple y en su lugar invocar cualquier material API reutilizable que tenga que sea específico de su instalador (es), tal como estamos acostumbrados con el desarrollo de UI. (El instalador es solo otra interfaz de usuario de todos modos.) Esto es especialmente importante si su objetivo es tener una cierta experiencia de UI compartida en todos los instaladores de sus productos.

1

También puede usar la utilidad installUtil.exe para probar su componente instalador.

En caso de que el montaje creado ac clase # con su clase de instalación, cambia la configuración de depuración para iniciar el programa externo 'C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe' e introduzca su argumentos de la línea de comando en consecuencia (por ejemplo,/Args = myargument "ruta al ensamblado")

Como último ajuste de sus puntos de corte, presione f5 y está configurado para depurar el código. --paralax

1

Utilizo la siguiente clase para escribir un registro simple en el directorio de destino. En mi opinión, es más fácil que tratar de usar el depurador de 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

Para propósitos de registro (en 3.5) ¿qué pasa con el uso de:

Context.LogMessage("My message"); 
9

sorprendido nadie ha respondido. Coloque un MessageBox.Show ("hello") en el miembro Install() de su acción personalizada. Cree la implementación en la configuración de depuración. Instalar. Cuando aparece el MessageBox, vaya a VS IDE, Debug, Attach Process y busque la instancia de msiexec que está etiquetada como "Managed". Adjunte el depurador a esa instancia de msiexec. Ahora regrese a la fuente de su acción personalizada y coloque un punto de interrupción justo después de la llamada a MessageBox.Show(). Cierre el MessageBox y se llegará a su punto de interrupción, ¡y está depurando en el IDE!

+4

+1: aunque podría ser destacable asegurarse de que la casilla 'Mostrar todos los procesos '* esté * marcada. Además, uno podría 'GetCurrentProcess' e identificar positivamente el proceso correcto con' Id'. :) – IAbstract

+0

¿Por qué utilizar esto cuando se puede llamar a 'System.Diagnostics.Debugger.Break()'? Tienes que agregar WindowsForms dll para usar MessageBox. Además, para CustomInstallers, el nombre del proceso será InstallUtil. – daniloquio

3

En su método de instalador, agregue la instrucción Debugger.Launch() que ejecutará el "depurador justo a tiempo de Visual Studio" donde puede adjuntar una instancia de Visual Studio y depurar su clase de instalador (MSI). Esto también debería funcionar en Visual Studio 2010. Pero necesita tener derechos administrativos para hacer esto. Si no tiene derechos administrativos, puede tener problemas. Por lo tanto, inicie sesión como administrador para depurar MSI. Por ejemplo:

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

} 

En Visual Studio 2005, incluso Debugger.Break() utiliza para trabajar, pero de alguna manera esto no funciona con Visual Studio 2010.

+0

+1 _Pero necesita tener derechos administrativos para hacer esto_. Esta es la única respuesta que dice esto, y creo que ese es mi problema. – transistor1

1

Escribe el siguiente código en el inicio del método que desea depurar

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

Así que cuando se llama a su método, el código anterior serán golpeados y luego se puede asociar el depurador al proceso (ctrl + alt + p) utilizando el ID de proceso anterior. Es posible que deba iniciar VS con permisos elevados.

0

Es posible automatizar la depuración de los proyectos de instalación mediante la adición de esta sección le sea .csproj o archivo .csproj.user:

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

Uso archivo de proyecto si desea que otros desarrolladores se benefician de este cambio y .user archivo si quieres usarlo por ti mismo

1

Ninguno de los anteriores funcionó para mí. Esto es lo que realmente funcionó. Tenga en cuenta que debe poner insertar "ambas" líneas.

using System.Diagnostics; 

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

Esto es lo que realmente funcionó para mí.

System.Diagnostics.Debugger.Launch(); 

haga clic derecho sobre el Proyecto de instalador y pulse "Instalar"

Cuestiones relacionadas