Pregunta

Necesito implementar múltiples versiones del mismo proyecto C# .NET. La salida del proyecto es un ensamblaje de interops de COM que se utilizará en una aplicación nativa. El problema que tengo es que tengo que implementar varias versiones de esta asamblea lado a lado, pero lo que sea que haga no parece crear diferentes versiones. En su lugar, las versiones se anulan entre sí.

Intenté cambiar el Guid de ensamblaje, intenté cambiar los números de versión de ensamblaje, intenté regenerar la tecla de nombre fuerte de ensamblaje, intenté cambiar el título de ensamblaje y la descripción. Prefiero no tener que cambiar el GUID o los nombres para los tipos individuales en el ensamblaje para fines de versiones.

¿Cómo me aseguro de que estas versiones no se anulen y que pueda ver e implementarlas de lado a lado?

¡Gracias por adelantado!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropTest
{
    [Guid("...")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Test
    {
        public Test()
        {
        }

        public string Version
        {
            get
            {
                return "1.0";
            }
        }
    }
}
¿Fue útil?

Solución

Prefiero no tener que cambiar el GUID o los nombres para los tipos individuales en el ensamblaje para fines de versiones.

Pero eso exactamente Lo que debe hacer para evitar que los tipos de COM interfieran entre sí. El [GUID] se utiliza para seleccionar la clave de registro en HKLM Software Classes CLSID donde se registra la clase COM. Dos versiones distintas con el mismo GUID se sobrescribirán las claves. También conocido como Dll Hell. Cambiar la interfaz pública requerimiento Un nuevo GUID para garantizar que los clientes que usan el anterior no mueran con imposible diagnosticar mal comportamiento. Un requisito de com roca.

Omitir el atributo [GUID] es muy posible, ahora deja que el CLR genere uno para usted. Ahora los atributos de ensamblaje comienzan a desempeñar un papel, el valor de GUID se genera automáticamente por un algoritmo resbaladizo que incluye el nombre del ensamblaje y la versión, así como el conjunto de métodos en la interfaz y sus argumentos. Asegurando así que ningún Los cambios producen automáticamente un GUID diferente. Y, como se esperaba y requerido, una [AssemblyVersion] diferente generará un [GUID] diferente.

Otro enfoque, que es lo que supuse que quisiste decir con 'lado a lado', es no Registre el ensamblaje pero confíe en un manifiesto en su lugar. Debe estar integrado en el programa del cliente, utiliza el <clrClass> Elemento para declarar su clase [Comvisible]. El versioneo ahora se convierte en un detalle de implementación. El msdn How-to es aquí. Tenga en cuenta que tiene que estar integrado en el cliente Programa, no su ensamblaje [Comvisible]. Eso tiende a ser un problema.

Otros consejos

Pruebe el enlace tardío al ensamblaje interops en su aplicación nativa si puede. También aconsejaría contra la generación automática de la interfaz usando autodual y, en su lugar, genere explícitamente su propia lectura este para más información. Puede solucionar el problema abriendo Regedit y buscando el GUID y el Progid para ver qué versiones del ensamblaje se han registrado.

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