tecnico sec requisitos planos para instalador firmar electricos electrico electricista denuncias cursos curso como certifico c# .net installer

sec - Depuración de clases de instalador personalizadas de C#



requisitos tecnico electricista (14)

Algo que es útil para las secciones de código difíciles de depurar es

System.Diagnostics.Debugger.Break()

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

Úselo para depurar áreas realmente difíciles donde el F5 + Go regular o "Adjuntar al proceso" es difícil o imposible de realizar, algunos ejemplos incluyen:

  • procesos de corta duración
  • procesos sensibles al tiempo
  • irrumpiendo en subprocesos engendrados
  • instaladores
  • parada / inicio del servicio
  • sistemas distribuidos

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?


En su método instalador, agregue la instrucción Debugger.Launch () que iniciará el "depurador justo a tiempo de Visual Studio" donde podrá 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 () suele funcionar, pero de alguna manera esto no funciona con Visual Studio 2010.


Escriba el siguiente código al comienzo del método que desea depurar

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

Entonces, cuando se llama a su método, se aplicará el código anterior y luego podrá adjuntar el depurador al proceso (ctrl + alt + p) utilizando el ID del proceso anterior. Es posible que deba iniciar VS con permisos elevados.


Esto es lo que realmente funcionó para mí.

System.Diagnostics.Debugger.Launch();

A continuación, haga clic derecho en el Installer Project y presione "Instalar"


La mejor manera que he encontrado es escribir una prueba de unidad, y actualizar e inicializar su clase de instalador desde la prueba de su unidad:

[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, 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.


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


Para fines de registro (en 3.5) ¿qué pasa con el uso de:

Context.LogMessage("My message");


Puede automatizar la depuración de los proyectos del instalador añadiendo la siguiente sección al archivo .csproj o .csproj.user:

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

Utilice el archivo de proyecto si desea que otros desarrolladores se beneficien de este cambio y el archivo .user si desea usarlo usted mismo.


Sorprendido, nadie ha respondido realmente. 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!


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

En caso de que haya creado el conjunto de clase de CA con su clase de Instalador, cambie la configuración de depuración para iniciar el programa externo ''C: / Windows / Microsoft.NET / Framework / v2.0.50727 / InstallUtil.exe'' e introduzca los argumentos de la línea de comandos correspondientes (por ej. / Args = myargument "camino al ensamblado")

Como último ajuste sus puntos de corte, presione f5 y está configurado para depurar su 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(""); } } }


Yo uso EventLog.WriteEntry ("fuente", "mensaje"), y verifico EventLog cuando instalo. Tal vez no sea óptimo, pero funciona para mí :)


adjunte el proceso del instalador a Visual Studio en Depurar-> Procesos-> Adjuntar o CTRL + ALT + P establecer el punto de interrupción y debe poder ir


construya una máquina virtual, instale Visual Studio, haga una copia de la misma (o cree una HDD virtual de diferenciación) y ejecute el instalador debajo del depurador debajo de la máquina virtual.

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