Quelqu'un peut-il expliquer le comportement suivant ?
En résumé, si vous créez plusieurs Conforme aux normes CLS dans Visual Studio 2008 et qu'elles partagent un espace de noms commun Root, une bibliothèque référençant une autre bibliothèque sera exiger Les références aux références de cette bibliothèque, même si elles ne les consomment pas.
C'est assez difficile à expliquer en une seule phrase, mais voici les étapes pour reproduire le comportement (faites attention aux espaces de noms) :
Créez une bibliothèque appelée LibraryA et ajoutez-y une classe unique :
namespace Ploeh
{
public abstract class Class1InLibraryA
{
}
}
Assurez-vous que la bibliothèque est conforme à la norme CLS en ajoutant [assembly: CLSCompliant(true)]
à AssemblyInfo.cs.
Créez une autre bibliothèque appelée LibraryB et faites référence à LibraryA. Ajoutez les classes suivantes à LibraryB :
namespace Ploeh.Samples
{
public class Class1InLibraryB : Class1InLibraryA
{
}
}
et
namespace Ploeh.Samples
{
public abstract class Class2InLibraryB
{
}
}
Assurez-vous que LibraryB est également conforme aux normes CLS.
Remarquez que Class1InLibraryB dérive d'un type de LibraryA, alors que Class2InLibraryB n'en dérive pas.
Créez maintenant une troisième bibliothèque appelée LibraryC et faites référence à LibraryB (mais pas à LibraryA). Ajoutez la classe suivante :
namespace Ploeh.Samples.LibraryC
{
public class Class1InLibraryC : Class2InLibraryB
{
}
}
Cela devrait quand même se compiler. Remarquez que Class1InLibraryC dérive de la classe de LibraryB que n'utilise aucun type de la bibliothèque A .
Remarquez également que Class1InLibraryC est défini dans un espace de noms qui fait partie de la hiérarchie d'espaces de noms définie dans LibraryB.
Jusqu'à présent, LibraryC n'a aucune référence à LibraryA, et comme elle n'utilise aucun type de LibraryA, la solution se compile.
Il faut maintenant que LibraryC soit également conforme à CLS. Soudain, la solution ne se compile plus, et le message d'erreur suivant apparaît :
Le type 'Ploeh.Class1InLibraryA' est défini dans un assemblage qui n'est pas référencé. Vous devez ajouter une référence à l'assembly 'Ploeh, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Vous pouvez faire en sorte que la solution soit à nouveau compilée de l'une des manières suivantes :
- Supprimer la conformité CLS de LibraryC
- Ajouter une référence à LibraryA (bien que vous n'en ayez pas besoin)
- Modifier l'espace de noms de LibraryC afin qu'il ne fasse pas partie de la hiérarchie des espaces de noms de LibraryB (par exemple, Fnaah.Samples.LibraryC).
- Modifier l'espace de noms de Class1InLibraryB (c'est-à-dire l'espace de noms de Class1InLibraryB). no utilisé à partir de LibracyC) de sorte qu'il ne se trouve pas dans la hiérarchie de l'espace de noms de LibraryC (par exemple, vers Ploeh.Samples.LibraryB).
Il semble qu'il y ait une interaction étrange entre la hiérarchie des espaces de noms et la conformité aux CLS.
Il est possible de résoudre ce problème en choisissant l'une des options de la liste ci-dessus. raison à l'origine de ce comportement ?