誰でも次の動作を説明できますか?
要約すると、Visual Studio 2008 で複数のCLS 準拠ライブラリを作成し、それらが共通の名前空間ルートを共有する場合、別のライブラリを参照するライブラリは、それらを消費しない場合でも、そのライブラリの参照への参照を必要とします。
一言で説明するのはかなり難しいですが、動作を再現する手順は次のとおりです (名前空間に細心の注意を払ってください)。
LibraryA という名前のライブラリを作成し、そのライブラリに単一のクラスを追加します。
namespace Ploeh
{
public abstract class Class1InLibraryA
{
}
}
[assembly: CLSCompliant(true)]
AssemblyInfo.csに追加して、ライブラリが CLS 準拠であることを確認します。
LibraryB という別のライブラリを作成し、LibraryA を参照します。次のクラスを LibraryB に追加します。
namespace Ploeh.Samples
{
public class Class1InLibraryB : Class1InLibraryA
{
}
}
と
namespace Ploeh.Samples
{
public abstract class Class2InLibraryB
{
}
}
LibraryB も CLS に準拠していることを確認してください。
Class1InLibraryB は LibraryA の型から派生していますが、Class2InLibraryB は派生していないことに注意してください。
ここで、LibraryC という 3 番目のライブラリを作成し、LibraryB を参照します (LibraryA は参照しません)。次のクラスを追加します。
namespace Ploeh.Samples.LibraryC
{
public class Class1InLibraryC : Class2InLibraryB
{
}
}
これでもコンパイルできるはずです。Class1InLibraryC は、LibraryA の型を使用しないLibraryB のクラスから派生していることに注意してください。
Class1InLibraryC は、LibraryB で定義された名前空間階層の一部である名前空間で定義されていることにも注意してください。
これまでのところ、LibraryC には LibraryA への参照がなく、LibraryA の型を使用していないため、ソリューションはコンパイルされます。
LibraryC も CLS に準拠するようになりました。突然、ソリューションがコンパイルされなくなり、次のエラー メッセージが表示されます。
タイプ 'Ploeh.Class1InLibraryA' は、参照されていないアセンブリで定義されています。アセンブリ 'Ploeh、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' への参照を追加する必要があります。
次のいずれかの方法で、ソリューションを再度コンパイルできます。
- LibraryC から CLS 準拠を削除する
- LibraryA への参照を追加します (必要ありませんが)。
- LibraryC の名前空間を、LibraryB の名前空間階層の一部にならないように変更します (たとえば、Fnaah.Samples.LibraryC に)。
- Class1InLibraryB (つまり、 LibracyC から使用されていないもの) の名前空間を、LibraryC の名前空間階層に含まれないように (たとえば、Ploeh.Samples.LibraryB に) 変更します。
名前空間階層と CLS 準拠の間には奇妙な相互作用があるようです。
この問題は、上記のリストのオプションのいずれかを選択することで解決できますが、この動作の背後にある理由を説明できる人はいますか?