Domanda

Devo distribuire più versioni dello stesso progetto C#. L'output del progetto è un assemblaggio di interropimento COM da utilizzare in un'applicazione nativa. Il problema che sto riscontrando è che devo distribuire diverse versioni di questo assembly fianco a fianco, ma qualunque cosa io faccia non sembra creare versioni diverse. Invece le versioni si preparano a vicenda.

Ho provato a modificare il GUID Assembly, ho provato a modificare i numeri di versione dell'assembly, ho provato a rigenerare il tasto di nome Strong Assembly, ho provato a modificare il titolo e la descrizione dell'assembly. Preferirei non dover cambiare i guid o i nomi per i singoli tipi nell'assemblaggio per scopi di versioni.

Come mi assicuro che queste versioni non si sovraposta a vicenda e che io possa vedere e distribuirle fianco a fianco?

Grazie in anticipo!

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";
            }
        }
    }
}
È stato utile?

Soluzione

Preferirei non dover cambiare i guid o i nomi per i singoli tipi nell'assemblaggio per scopi di versioni.

Ma quello Esattamente Cosa devi fare per evitare che i tipi COM interferiscano tra loro. [GUID] viene utilizzato per selezionare la chiave di registro in HKLM software Classes CLSID in cui è registrata la classe COM. Due versioni distinte con lo stesso GUID sovrascriveranno le chiavi reciproche. Altrimenti noto come DLL Hell. Cambiare l'interfaccia pubblica richiede Un nuovo GUID per garantire che i clienti che usano il vecchio non muoiano con impossibile diagnosticare il comportamento scorretto. Un requisito di com-rock.

Omettire l'attributo [GUID] è molto possibile, ora lasci al CLR generarne uno per te. Ora gli attributi di assemblaggio iniziano a svolgere un ruolo, il valore GUID è generato automaticamente da un algoritmo slick che include il nome dell'assembly e la versione, nonché l'insieme di metodi sull'interfaccia e i loro argomenti. Garantire così qualunque I cambiamenti producono automaticamente un GUID diverso. E, come previsto e richiesto, una diversa [Assemblyversion] genererà un [GUID] diverso.

Un altro approccio, che è quello che ho pensato che intendessi con "fianco a lato", è a non Registra invece l'assemblaggio ma fai affidamento su un manifest. Deve essere incorporato nel programma client, si utilizza il <clrClass> Elemento per dichiarare la tua classe [comunicata]. Il versioning ora diventa un dettaglio di distribuzione. MSDN How-to è qui. Tieni presente che deve essere incorporato nel cliente Programma, non il tuo assemblaggio [comunibile]. Questo tende ad essere un problema.

Altri suggerimenti

Prova il legame tardivo all'assemblaggio interrogato nella tua applicazione nativa, se puoi. Consiglierei anche di generare automaticamente l'interfaccia usando autodual e invece di generare esplicitamente la tua lettura questo per maggiori informazioni. È possibile risolvere il problema aprendo regedit e alla ricerca di GUID e Progid per vedere quali versioni dell'assembly sono state registrate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top