これらは全て、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に準拠していない型が含まれている。
実の所、CLSCompliant属性を付けることによる利点がいまいちわからなかったり・・・(・∀・;)
別に付けなくても、C#のアセンブリをVBから利用することできるよなぁ・・・。
全ての型がCLS準拠じゃないことになって、その型を継承したり、引数の型にしたりすると、そいつもCLS非準拠になっちゃうけど、結局それで何が困るんだかわかんないや。
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/29-be04dbe2