visual studio instalar code change autocompletar visual-studio-2008 installation registration ccw

instalar - Cómo registrar un CCW de.NET con regasm desde un proyecto de instalación de Visual Studio 2008



visual code studio workspace (4)

Su servicio debe tener una clase Installer. Regístrese en el evento OnAfterInstall y llame a RegAsm: la ruta debe calcularse desde el directorio de Windows y vincularse a una versión .Net específica.

Tengo un proyecto de configuración para una aplicación de servicio .NET que utiliza un componente .NET que expone una interfaz COM (envoltorio COM / CCW invocable). Para que el componente funcione en una máquina de destino, debe registrarse con

regasm.exe / tlb / codebase component.dll

El modificador / tlb para generar typelib es obligatorio en este caso; de lo contrario, no puedo crear objetos a partir de ese ensamblado.

La pregunta es, ¿cómo puedo configurar mi Visual Studio 2008 Setup-Project para registrar este ensamble con una llamada a regasm / tlb?


  1. En su proyecto principal (el que contiene la clase que desea registrar), haga clic con el botón derecho en el archivo del proyecto y seleccione Agregar / Nuevo elemento y seleccione Clase de instalador. Llámalo algo así como clsRegisterDll.cs
  2. En el diseñador que aparece, haga clic en ''Haga clic aquí para cambiar a la vista de código'' o haga clic con el botón derecho en el archivo clsRegisterDll.cs en el explorador de soluciones y seleccione Ver código
  3. Anule los métodos de instalación, ejecución y desinstalación agregando:

    // Obtener la ubicación de regasm string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory () + @ "regasm.exe"; // Obtener la ubicación de nuestra cadena DLL componentPath = typeof (RegisterAssembly) .Assembly.Location; // Ejecutar Regasm
    System.Diagnostics.Process.Start (regasmPath, "/ codebase / tlb /" "+ componentPath +" / "");

    Cambie / codebase / tlb por / u en la acción de desinstalación.

  4. Compila tu proyecto
  5. En su instalador, asegúrese de haber agregado su dll a la Carpeta de la aplicación, y luego haga clic con el botón derecho en el proyecto del instalador y seleccione Ver / Acciones personalizadas
  6. Haga clic con el botón derecho en Instalar, y luego haga clic en Agregar acción personalizada
  7. Haga doble clic en Carpeta de la aplicación y luego en su dll
  8. Haz lo mismo para la acción de compromiso
  9. Crea y prueba tu instalador

Puede encontrar un tutorial con una clase real para probar en: http://leon.mvps.org/DotNet/RegasmInstaller.html


Puede perder la llamada manual a regasm.exe utilizando en su lugar System.Runtime.InteropServices.RegistrationServices:

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] public override void Install(IDictionary stateSaver) { base.Install(stateSaver); RegistrationServices regsrv = new RegistrationServices(); if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase)) { throw new InstallException("Failed to register for COM Interop."); } } [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)] public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); RegistrationServices regsrv = new RegistrationServices(); if (!regsrv.UnregisterAssembly(GetType().Assembly)) { throw new InstallException("Failed to unregister for COM Interop."); } }

Esto también anula el registro de la biblioteca luego de la desinstalación.


Inicialmente intenté ejecutar Regasm desde el proceso de instalación (antes de ver esta publicación). Tratar de ejecutar regasm y manejar todos los errores fue problemático, incluso sin tratar de manejar privilegios elevados para Windows 7.

El uso de Runtime.InteropServices.RegistrationServices.RegisterAssembly era mucho más limpio y proporcionaba una captura de errores mucho mejor.