Pregunta

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

  

regasm.exe / tlb / codebase component.dll

El modificador / tlb para generar el typelib es obligatorio en este caso, de lo contrario no puedo crear objetos de ese ensamblaje.

La pregunta es, ¿cómo puedo configurar mi proyecto de instalación de Visual Studio 2008 para registrar este conjunto con una llamada a regasm / tlb?

¿Fue útil?

Solución

Puede perder la llamada manual a regasm.exe usando System.Runtime.InteropServices.RegistrationServices en su 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 al desinstalar.

Otros consejos

  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, seleccione Agregar / Nuevo elemento y seleccione Clase de instalador. Llámelo 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, confirmació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 DLL string componentPath = typeof (RegisterAssembly) .Assembly.Location; // Ejecutar regasmo
    System.Diagnostics.Process.Start (regasmPath, " / codebase / tlb \ " + componentPath + " \ " "))

    Swap / codebase / tlb for / 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 aplicaciones, 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. Haz doble clic en la carpeta de aplicaciones y luego en tu dll
  8. Haz lo mismo con la acción Commit
  9. Construye y prueba tu instalador

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

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.

Inicialmente intenté ejecutar regasm desde el proceso del instalador (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ó una captura de errores mucho mejor.

El instalador de Visual Studio solo realiza el registro de la clase COM, pero no hace la generación y el registro de la biblioteca de tipos (esto es lo que hace el interruptor / tlb en regasm.exe ) por defecto. Al menos en Visual Studio 2017 es suficiente generar la biblioteca de tipos en los pasos posteriores a la compilación de la DLL para registrarse utilizando la utilidad Tlbexp.exe .

Si el proyecto del instalador descubre un archivo con la extensión .tlb en el mismo directorio y con el mismo nombre que la biblioteca que está instalando, lo incluye automáticamente en el proyecto de instalación y realiza los pasos de registro durante la instalación. Por supuesto, también es posible generar el archivo .tlb a mano e incluirlo en el proyecto de configuración (y establecer su propiedad de Registro en vsdrfCOM ).

Aquí hay un gran artículo sobre C # y la interfaz COM y la información anterior proviene de su sección llamada Implementación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top