2008-10-27 11 views
5

Tengo un proyecto de instalación para una aplicación de servicio .NET que usa un componente .NET que expone una interfaz COM (envoltorio COM/CCW invocable). Para obtener el componente de trabajo en un equipo de destino, tiene que estar registrado en component.dllCómo registrar un CCW .NET con regasm desde un proyecto de instalación de Visual Studio 2008

regasm.exe/TLB/código base

El/TLB interruptor para generar la biblioteca de tipos es obligatoria en este caso, de lo contrario no puedo crear objetos a partir de ese ensamblaje.

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

Respuesta

13

Se puede perder la llamada manual para Regasm.exe utilizando System.Runtime.InteropServices.RegistrationServices lugar:

[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 después de la desinstalación.

+1

¿A qué se debe agregar este código? Tengo un proyecto de VB.net que necesita el regasm y tiene algunas dependencias de C#. Estos dos métodos se pueden agregar a una clase que implementa qué superclase o interfaz? – Amala

+0

Veo que estos dos métodos entran en una clase que anula System.Configuration.Install.Installer, luego esta clase individual se agrega como salida principal. No estoy seguro de cómo agregar esta clase o estas acciones al instalador. ¿Se agregarán automáticamente con el ensamblaje o necesito agregar una acción? – Amala

+0

'" No estoy seguro de cómo agregar esta clase o estas acciones al instalador ". Ver el [enlace de Wolfwyrd] (http://leon.mvps.org/DotNet/RegasmInstaller.html) en otra respuesta , para detalles sobre cómo agregar esto a su paquete de instalador. Esta respuesta es una modificación del código en el artículo vinculado. – transistor1

1

Su servicio debe tener una clase de Instalador. 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.

4
  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. Llamarlo 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 derecho en el archivo clsRegisterDll.cs explorador de soluciones y seleccione Ver código
  3. Sustituir el Instalar, Confirmar y los métodos de desinstalación añadiendo:

    // Obtener la ubicación de regasm cadena regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() + @ "regasm.exe"; // Obtener la ubicación de nuestra DLL string 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. compilar su proyecto
  5. En su instalador, asegúrese de que ha añadido el archivo DLL a la carpeta de aplicación y, a continuación, haga clic en el proyecto de instalación y seleccione Ver acciones/Custom
  6. Haga clic en Instalar y, a continuación, haga clic en Agregar acción personalizada
  7. doble clic en carpeta de la aplicación, y luego en su DLL
  8. Haga lo mismo para la acción Commit
  9. construir y probar su instalador

Un tutorial con una clase real para que usted intente se puede encontrar en: http://leon.mvps.org/DotNet/RegasmInstaller.html

+1

El enlace de Wolfwyrd ha cambiado a http://leon.mvps.org/DotNet/RegasmInstaller.aspx – dashrb

1

Inicialmente traté de ejecutar regasm desde el proceso de instalación (antes de ver esta publicación). Intentar 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 fue mucho más limpio y proporcionó un error de captura mucho mejor.

Cuestiones relacionadas