È possibile che due DLL siano in conflitto, impedendo la creazione di una soluzione

6

Anche se ho un caso specifico, ma mi chiedevo la situazione generale.

Possono due DLL, aggiunte come riferimento a un progetto Visual C # in collisione tra loro per impedire la creazione della soluzione? Se questo è il caso, quali sono i modi possibili per mitigarlo.

    
posta Shamim Hafiz 05.10.2011 - 12:44
fonte

5 risposte

12

Questo è molto possibile.

Se hai definito uno spazio dei nomi e un nome di tipo identici su diversi assiemi (o nel tuo progetto e nell'assieme aggiunto), otterrai un conflitto con qualsiasi codice che tenta di utilizzare uno o l'altro di questi tipi.

Se ti assicuri di avere spazi dei nomi univoci, così come i tuoi riferimenti non avresti questo problema.

Un'altra possibilità ha a che fare con diverse versioni di una dipendenza - se il progetto utilizza (per esempio) una libreria di logging alla versione 1.2, ma l'assembly aggiunto ha una dipendenza dallo stesso assembly ma una versione diversa (ad esempio 1.3) e il tuo progetto o l'assembly aggiunto è stato configurato / costruito per utilizzare una versione specifica, si verificherà un conflitto e la generazione fallirà.

Entrambi questi problemi possono essere risolti usando gli alias di assembly, come descritto qui .

    
risposta data 05.10.2011 - 12:54
fonte
4

Visto che nessun altro ha menzionato questo, hai chiesto:

what are the possible ways to mitigate this

Esiste una soluzione pulita solo per questo caso, senza vincoli e senza fastidiose soluzioni alternative. Puoi definire assi di montaggio in modo che il compilatore sappia a quali fare riferimento nel posto giusto.

Dai un'occhiata al link

    
risposta data 05.10.2011 - 18:04
fonte
3

Sì, questo è molto possibile.
Diciamo che hai aggiunto un riferimento ad alcune DLL che usano la vecchia versione di Lucene.Net e vuoi includere l'ultima versione.
Puoi risolvere il problema utilizzando alias esterni: link

    
risposta data 05.10.2011 - 14:40
fonte
1

Puoi mettere come diverse versioni di un assembly come vuoi nel Cache assembly globale a condizione che siano denominati con il nome sicuro. Questo può aiutarti se vuoi che applicazioni diverse utilizzino versioni diverse di un assembly, dal punto di vista della macchina. Tuttavia, l'utilizzo di versioni diverse di un assieme in un'applicazione ONE ti porterà comunque nei guai.

Qual è la ragione per cui hai bisogno di entrambe le versioni allo stesso tempo?

    
risposta data 05.10.2011 - 13:46
fonte
0

Di sicuro. È possibile ottenere l'errore del compilatore "Riferimento ambiguo" quando non è possibile distinguere due oggetti. In genere, è possibile specificare il percorso completo nel codice e non causerà un problema, ma se le DLL fossero completamente identiche, non si sarebbe in grado di distinguere tra due oggetti in alcun modo. Sya abbiamo due DLL:

System.IO che contiene la classe File

e

MyProject.IO che contiene una classe File

Se avessi qualcosa di simile ...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

... avresti un riferimento ambiguo, poiché non c'è modo di sapere di quale file stai parlando. Questo lo risolverebbe:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

L'unico modo in cui sarebbe difficile risolvere sarebbe se il percorso di "File" fosse identico in entrambi gli assembly, ma ciò richiederebbe la situazione improbabile in cui due DLL avevano una struttura dello spazio dei nomi identica. Ad esempio, la mia situazione di sopra non sarebbe mai successa, dal momento che nessuno chiamerebbe il progetto "Sistema" (ad eccezione degli sviluppatori effettivi del framework .Net).

    
risposta data 05.10.2011 - 15:41
fonte

Leggi altre domande sui tag