He escrito una clase de instalación que amplía Installer y reemplaza afterInstall, pero obtengo una excepción de puntero nulo. ¿Cómo puedo depurar mi clase?Depurando C# Clases de instalador personalizadas
Respuesta
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).
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
¿Y cuál es el proceso de instalador (nombre?) – Sandeep
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
No funcionó para mí, sin hacer primero System.Diagnostics.Debugger.Launch() –
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
Esta es una de las mejores cosas que he aprendido aquí. –
Uso EventLog.WriteEntry ("fuente", "mensaje") y compruebo el EventLog durante la instalación. Tal vez no es óptima, pero funciona para mí :)
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
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.
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
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(""); }
}
}
Para propósitos de registro (en 3.5) ¿qué pasa con el uso de:
Context.LogMessage("My message");
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!
+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
¿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
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.
+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
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.
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
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();
Esto es lo que realmente funcionó para mí.
System.Diagnostics.Debugger.Launch();
haga clic derecho sobre el Proyecto de instalador y pulse "Instalar"
- 1. Crear clases dinámicas personalizadas en Objective-C
- 2. Clases personalizadas en CodeIgniter
- 3. la salmuera de clases personalizadas
- 4. Creando instancias de clases de C# personalizadas de IronPython
- 5. Cargando clases personalizadas en CodeIgniter?
- 6. BsonValue y clases personalizadas en MongoDB C# Driver
- 7. Depurando fuera de memoria
- 8. Rails3 visitas de Arel a clases personalizadas
- 9. Rieles: uso de clases personalizadas en Rails
- 10. Symfony2 donde colocar clases personalizadas de ayuda
- 11. ¿Cómo debo almacenar mis clases personalizadas?
- 12. Excepciones personalizadas en C++
- 13. Primitivas personalizadas en C#?
- 14. ¿Cómo obtener intellisense para clases personalizadas?
- 15. Cómo almacenar clases personalizadas usando CoreData
- 16. ¿Capturas múltiples excepciones personalizadas? - C++
- 17. Depurando Pyparsing Grammar
- 18. WIX Marco de tiempo del instalador para desarrollar un instalador
- 19. C# - ¿Utiliza anotaciones personalizadas?
- 20. Depurando en SSIS
- 21. Depurando en PIG UDF
- 22. Instalador para la aplicación C#
- 23. Uso de Rails Form Helpers con clases personalizadas serializadas
- 24. ¿Cómo puedo ordenar una matriz de clases personalizadas?
- 25. Asignación de clases enum personalizadas con Fluent Nhibernate
- 26. ColdFusion: sobre el uso de clases Java personalizadas "propias escritas"
- 27. Escribir un WPF Wix instalador
- 28. Atributos de propiedades personalizadas en Objective-c
- 29. Depurando tareas en segundo plano
- 30. REMOTO Depurando PHP usando Eclipse
combinar esto con la punta System.Diagnostics.Debugger.break() y la vida se pone muy buenos para producir repros depurables. – stephbu