COM ASSEMBRI SALA ALLA SIDE
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";
}
}
}
}
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.