2010-01-27 14 views
6

Estoy intentando escribir un proyecto de instalación/instalador para un controlador de biblioteca de clase que escribí en C# utilizando Visual Studio 2008. El proyecto del controlador tiene una sección de código que se ve así ...¿Por qué mi proyecto de instalación no realizará mi proceso de registro personalizado?

[ComRegisterFunction] 
    public static void RegisterASCOM(Type t) 
    { 
     Trace.WriteLine("Registration Started."); 
     DoRegistration(true); 
    } 

En las propiedades del proyecto piloto -> "Información de ensamblado" he puesto marcado la casilla que dice Haga COM-Visible = true.

Agregué un proyecto de instalación a la solución en VS, agregué el dll de salida del proyecto del controlador para que se instale en la máquina de destino y establezca la propiedad de registro de la dll en "vsdraCOM". Entonces, tengo entendido que cuando el instalador lo ejecute DEBERÍA ejecutar los métodos del dll que están marcados con [COMRegisterFunction].

Uso de la vista de depuración de SysInternals Puedo controlar cuándo se ve el fragmento de código anterior al observar que aparezca el texto "Registro iniciado" en la ventana. Cuando construyo la solución, puedo ver el texto aparecer así sé que el controlador se está registrando correctamente. El problema es que cuando ejecuto el instalador, no creo que esté haciendo el bit de registro. No veo nada en Debug View. Y si intento acceder a mi controlador a través de otra aplicación, aparece un error que dice "No se puede crear un objeto ActiveX". ¿Por qué el registro no ocurre durante el proceso de instalación?

El controlador se registra para COM pero NO llama a mi método de registro personalizado.

¿Alguien tiene y sugerencias de lo que podría estar perdiendo? ¿Hay alguna otra manera de depurar esto?

(I tiene más de código si alguien quiere de a echar un vistazo !!)

Respuesta

8

Si el instalador no está registrando los objetos COM utilizando el mecanismo por defecto, puede intentar forzarla mediante una acción personalizada. Un beneficio adicional de esta técnica es que puede realizar un solo paso a través de la acción personalizada para resolver lo que está sucediendo.

Añadir una clase a su proyecto que hereda de instalador, está decorado con este atributo

[RunInstaller(true)] 

y anula uno o más de los siguientes métodos:

Install() 
Uninstall() 
Commit() 
Rollback() 

Aquí está un ejemplo completo que realiza registro con COM Interop. Está salpicado de resultados de rastreo que (al contrario de algunas opiniones) se mostrarán en Sysinternals DebugVw. Cuando se construye en la configuración de depuración, colocará un cuadro de diálogo que le permite adjuntar un depurador y un solo paso a la acción personalizada.

using System.ComponentModel; 
using System.Configuration.Install; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace TiGra 
    { 
    /// <summary> 
    /// Custom install actions that must be carried out during product installation. 
    /// </summary> 
    [RunInstaller(true)] 
    public class MyInstaller : Installer 
     { 

     /// <summary> 
     /// Custom Install Action that performs custom registration steps as well as 
     /// registering for COM Interop. 
     /// </summary> 
     /// <param name="stateSaver">Not used<see cref="Installer"/></param> 
     public override void Install(System.Collections.IDictionary stateSaver) 
      { 
      Trace.WriteLine("Install custom action - Starting registration for COM Interop"); 
#if DEBUG 
      MessageBox.Show("Attach debugger to this process now, if required", "Custom Action Debug", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
#endif 
      base.Install(stateSaver); 
      RegistrationServices regsrv = new RegistrationServices(); 
      if (!regsrv.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase)) 
       { 
       Trace.WriteLine("COM registration failed"); 
       throw new InstallException("Failed To Register for COM Interop"); 
       } 
      Trace.WriteLine("Completed registration for COM Interop"); 
      } 

     /// <summary> 
     /// Custom Install Action that removes the COM Interop component registrations. 
     /// </summary> 
     /// <param name="savedState">Not used<see cref="Installer"/></param> 
     public override void Uninstall(System.Collections.IDictionary savedState) 
      { 
      Trace.WriteLine("Uninstall custom action - unregistering from COM Interop"); 
      try 
       { 
       base.Uninstall(savedState); 
       RegistrationServices regsrv = new RegistrationServices(); 
       if (!regsrv.UnregisterAssembly(this.GetType().Assembly)) 
        { 
        Trace.WriteLine("COM Interop deregistration failed"); 
        throw new InstallException("Failed To Unregister from COM Interop"); 
        } 
       } 
      finally 
       { 
       Trace.WriteLine("Completed uninstall custom action"); 
       } 
      } 
     } 
    } 

Una última cosa que queda por hacer. Las acciones personalizadas no se ejecutarán a menos que el instalador esté configurado para hacerlo. Aquí se explica cómo:

  • En su proyecto de instalador de Visual Studio, haga clic con el botón derecho en el nombre del proyecto y seleccione Ver -> Acciones personalizadas.Usted verá una vista de árbol o menos así:
    • acciones personalizadas
      • Instalar
      • desinstalación
      • Commit
      • Rollback
  • Haga clic derecho en la parte superior nodo (acciones personalizadas) y seleccione Añadir Cus tom Acción.
  • Navegue al resultado del archivo o proyecto que contiene su clase que está decorada con el atributo [RunInstaller (true)], resáltelo y haga clic en Aceptar.
  • La salida de su proyecto debe aparecer debajo de cada uno de los cuatro nodos. Esto significa que se llamará a su clase de acción personalizada durante cada una de las cuatro fases del instalador.

Si necesita un control más fino sobre esto, puede agregar la clase de acción personalizada a algunas de las fases del instalador pero no a otras. Por ejemplo, si la instalación y la desinstalación son manejadas por diferentes ensamblajes, puede agregar un ensamblaje debajo de los nodos Instalar y Confirmar y el otro ensamblaje debajo de los nodos Desinstalar y Revertir.

Así que eso es todo, ahora se llamarán sus acciones personalizadas durante la instalación. Un consejo rápido para depurar acciones personalizadas. Use una directiva condicional (como en el ejemplo anterior) para mostrar un cuadro de mensaje cuando se encuentre en la compilación de depuración. Este cuadro de mensaje se mostrará luego durante la instalación. Eso detiene el proceso de configuración hasta que haga clic en Aceptar en el cuadro de mensaje, esto le da lo que podría llamar "una ventana de oportunidad" (juego de palabras) para adjuntar el depurador al proceso msiexec.exe. Se ejecutarán varios procesos msiexec.exe, debe elegir el que dice que es código administrado. El depurador se adjuntará y sus puntos de interrupción se "iluminarán", por lo que puede interceptar la ejecución y un solo paso a través de su acción personalizada.

Cuestiones relacionadas