web-dev-qa-db-fra.com

Est-il possible que deux DLL sont en conflit, empêchant la solution de construire

Bien que j'ai un cas particulier, mais je me demandais de la situation générale.

Deux DLL peuvent-elles ajouter en tant que référence à un projet Visual C # en collision les uns avec les autres pour empêcher la solution de la construction? Si tel est le cas, quelles sont les moyens possibles d'atténuer cela.

9
Shamim Hafiz

C'est très possible.

Si vous avez défini un espace de noms identique et un nom de type sur différents assemblages (ou dans votre projet et l'ensemble ajouté), vous obtiendrez un conflit avec n'importe quel code qui essaie d'utiliser l'un ou l'autre de ces types.

Si vous vous assurez que vous avez des espaces de noms uniques, de même que vos références, vous n'auriez pas ce problème.

Une autre possibilité a à voir avec différentes versions d'une dépendance - si votre projet utilise (par exemple) une bibliothèque de journalisation à la version 1.2, mais l'assemblage ajouté a une dépendance sur le même assemblage, mais une version différente (disent 1.3) et votre projet. Ou l'assemblage ajouté a été configuré/conçu pour utiliser une version spécifique, vous obtiendrez un conflit et la construction échouera.

Ces deux problèmes peuvent être résolus à l'aide d'alias d'assemblage, comme décrit ici .

13
Oded

Voyant comme personne d'autre l'a mentionné cela, vous avez demandé:

quels sont les moyens possibles d'atténuer cela

Il existe une solution propre uniquement pour ce cas, sans contraintes et sans solution de contournement ennuyeuse. Vous pouvez définir des alèmes de montage afin que le compilateur sache ceux qui se réfèrent au bon endroit.

Regardez - http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx

4
Yam Marcovic

Oui, c'est très possible.
[.____] Disons que vous avez ajouté une référence à certains DLL qui utilise l'ancienne version de Lucene.net et vous souhaitez inclure la dernière version.
[.____] Vous pouvez résoudre ce problème en utilisant des alias externes: http://msdn.microsoft.com/en-us/library/ms173212.aspx

3
šljaker

Vous pouvez mettre autant de versions différentes d'un assemblage comme vous le souhaitez dans le Cache de montage global à condition qu'ils soient forts-nommés. Cela peut vous aider si vous souhaitez que différentes applications utilisent différentes versions d'un assemblage, de la machine. Cependant, en utilisant différentes versions d'un assemblage dans une seule application vous fera tomber en difficulté.

Quelle est la raison pour laquelle vous avez besoin de deux versions en même temps?

1
Jalayn

Avec certitude. Vous pouvez obtenir une erreur de compilateur "référence ambiguë" lorsque deux objets ne peuvent pas être distingués. En règle générale, vous pouvez spécifier le chemin complet dans le code et cela ne provoquera pas de problème, mais si les DLL étaient entièrement identiques, vous ne seriez pas en mesure de distinguer entre deux objets. Sya nous avons deux dlls:

Système.io qui contient la classe de fichiers

et

MyProject.io qui contient une classe de fichier

Si vous deviez avoir quelque chose comme ça ...

using System.IO;
using MyProject.IO;

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

... vous auriez une référence ambiguë, car il n'ya aucun moyen de dire quel fichier dont vous parlez. Cela le corrigerait:

using System.IO;
using MyProject.IO;

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

La seule façon dont il serait difficile de résoudre serait si le chemin du "fichier" était identique dans les deux assemblages, mais cela nécessiterait la situation improbable où deux DLL avaient une structure de noms de noms identiques. Par exemple, ma situation ci-dessus n'arriverait jamais, car personne ne va nommer le projet "Système" (à l'exception des développeurs réels de la framework .NET).

0
Morgan Herlocker