C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/09/28 20:04
.NET Frameworkの上で動く言語は、C#、VB.NET、C++/CLI、J#、Delphi.NETなどなど、多数ある。
これらは全て、MSILと呼ばれる中間コードへとコンパイルされる。

MSILへコンパイルされたアセンブリは、他の.NET言語から簡単に利用できる。
しかし、ある言語では実装されているが、ある言語では実装されていない機能がある。例えばC++やC#の「ポインタ」は、VB.NETでは利用できない。


全ての.NET言語がサポートしなければならない仕様を共通言語仕様(CLS)と呼ぶ。
CLSは、外部に公開する部分にだけ適用される。つまり、メソッド内の処理コードなどには関係ない。
先程挙げた「ポインタ」は、CLSに定義されていないため、実装されている言語とされていない言語が存在する。

クラスライブラリで公開しているクラスのメンバに、ポインタを返すメソッドがあったとする。ポインタはCLSに定義されていないため、このメソッドは、CLSに準拠していないメンバとなる。当然VB.NETからこのメンバを利用することはできない。

クラスライブラリを開発する際に、開発言語とは異なる言語からの利用が想定される場合、クラスライブラリをCLS準拠にする必要がある。

CLSに準拠させるには、当然、公開する箇所がCLSの規定に従っている必要がある。ただし、それだけではなく、CLS準拠であることを明示的に示さなければならない。

CLS準拠であることを明示的に示すには、CLSCompliantAttributeを用いる。
CLSCompliantAttributeは、アセンブリ、型、メンバに対して有効であり、アセンブリに対して(通常、AssemblyInfo.csに)
[assembly: System.CLSCompliant(true)]
を付加することで、アセンブリに含まれる全ての型、メンバがCLS準拠であると示したことになる。
CLS非準拠な型やメンバが含まれている場合は、個別に
[System.CLSCompliant(false)]
を付加することで、部分的にCLS非準拠を示せる。


なお、.NET Frameworkの主要クラスライブラリであるmscorlibも、ほとんどの型はCLSに準拠しているが、UInt32構造体など、一部CLSに準拠していない型が含まれている。

スポンサーサイト



タグ: .NET CLS