FAQ
.NET 環境における COM オブジェクトの使用について- Point クラス vs. PointClass クラス

ナレッジ番号:2745 | 登録日:2023/05/29 | 更新日:2023/12/28

概要

Visual Basic プログラマが .NET へ移行する際、いくつかの基本的な事項について良く理解しておく必要があります。 開発環境が異なることによる大きな違いは、.NET の管理下で動くコードはマネージ コードと呼ばれ、ArcObjects のようなアンマネージ コードで動く COM コンポーネントとは直接やりとりができないため、COM 相互運用という技術を利用して対話を行うということです。 このトピックでは .NET の開発環境から COM コンポーネントである ArcObjects と対話する仕組みやコードの移行の際の注意点について情報を提供します。

COM 相互運用

.NET の管理下で動いているコードはマネージ コードと呼ばれます。 逆に、.NET の管理外で動いているコードはアンマネージ コードと呼ばれます。これらは異なる環境下で動作するため、互いにやりとりするにはそのための仕組みが必要になります。 .NET Framework が COM オブジェクトと対話するには COM 相互運用という技術を介して行います。そのためには、共通言語ランタイムはすべての COM の型のメタデータを必要とします。従って通常はタイプライブラリに保存された COM 型の定義は、.NET のメタデータに変換されなければなりません。 一旦メタデータが生成されると、.NET のクライアントは COM相互運用の技術により COM 型のインスタンスをシームレスに生成し、あたかも .NET ネイティブのインスタンスであるかのようにそのメソッドを呼ぶことができるようになります。.NET クライアントと COM オブジェクト 間の呼び出しをマーシャリングするこの仕組みはランタイム呼び出し可能ラッパー (RCW: Runtime Callable Wrapper) が提供します。RCW は .NET クライアントからは普通のオブジェクトのように見えますが、ラップされた COM オブジェクトを公開するために経由されるプロキシです。

COM から .NET 型への変換

すべての COM クラスはマネージ クラスに変換されますが、その名称は元のクラス名に Class を追加したものになります。 例えば、Point コクラスの場合は、マネージ クラスでは PointClass になります。 以下に簡単なコード例を示します。
ESRI.ArcGIS.Geometry.IPoint aPt = new ESRI.ArcGIS.Geometry.PointClass();
aPt.PutCoords(10, 8);
Dim aPt As ESRI.ArcGIS.Geometry.IPoint = New ESRI.ArcGIS.Geometry.PointClass()
aPt.PutCoords(10, 8)
上記のコードは
Dim aPt As ESRI.ArcGIS.Geometry.IPoint = New ESRI.ArcGIS.Geometry.Point()
aPt.PutCoords(10, 8)
としても動作し、またこのように書かれたプログラムも存在します。 マネージ クラスに変換された COM クラスの名称は元のクラス名に Class を追加したものになりますが、このコードは元の COM のコクラスと同じ名前をもつ、クラス インターフェイスを使用していることを意味します。 クラス インターフェイスについては、次の項目で説明します。

クラス インターフェイス

すべての COM クラスはマネージ クラスに変換されて、元のクラス名に Class を追加したも名称をもちますが、同時にすべてのマネージ クラスは COM のコクラスと同じ 名前のインターフェイスを持ちます。 これをクラス インターフェイスと呼びます。このインターフェイスは、そのコクラスに対するデフォルト インターフェイスに相当します。 たとえば PointClass は Point インターフェイスを持ちます。 クラス インターフェイスは Visual Basic プログラマが .NET へ移行するために作成されました。オブジェクト ライブラリのインポート時には、COM クラスごとにクラス インターフェイス RCW が生成されます。クラス インターフェイスは RCWなのでこれを介して ArcObjects を呼ぶことができます。このため、.NET において Visual Basic と同 じ構文を利用しても COM オブジェクト を使用することができたのです。 クラス インターフェイスを使用したコードは、Visual Basic アップグレード ウィザードや Visual Studio .NET のコード スニペット コンバータによって生成されたコードで見られます。クラス インターフェイスは、クラス インターフェイスが属するクラスを示す属性によってクラスにリンクされます。この属性が .NET コンパイラによって認識されるため、プログラマはクラス インターフェイスを使ってクラスをインスタンス化することができます。Visual Basic .NET を使用している場合、オブジェクトブラウザで PointClass はデフォルトでは表示されませんが、[非表示のメンバを表示] オプションをチェックすると 表示されるようになります。 Visual C# のオブジェクト ブラウザでは、Point クラス インターフェイスと、その継承インターフェイスである IPoint および PointClass クラスを簡単に確認することがで きます。

クラス インターフェイスが推奨されない理由

.NET 環境でこの COM のクラスにアクセスするには、 元のクラス名に Class を追加した名称をもつクラスと、元のクラス名と同じ名前をもつクラス インターフェイスのどちらでもアクセ スできますが、ArcGIS のバージョンが異なる場合、クラス インターフェイスの継承インターフェイスが将来的にも同じであるという保証はありません。このため、Esri 相互運用アセンブリでは、クラス インターフェイスを使用しないことが推奨されています。 元の COM クラスは、COM クラス名の最後に「Class」が付いた名前をもつ、新たに生成された RCW よって参照するようにします。

.NETクラスがサポートするメンバ

.NET のクラスは COM クラスがサポートしていないクラスメンバをサポートしています。クラスが実装しているすべてのインターフェイスの個々のメンバがクラスのメンバ として 追加されていますので、特定のインターフェイスにキャストせずとも、クラスがサポートする すべてのメソッドとプロパティに、直接クラスからアクセスすることができます 。 以下の簡単なコード例をみてください。
ESRI.ArcGIS.Geometry.PointClass thePt = new ESRI.ArcGIS.Geometry.PointClass();
thePt.PutCoords(10, 8);
Dim thePt As ESRI.ArcGIS.Geometry.PointClass = New ESRI.ArcGIS.Geometry.PointClass()
thePt.PutCoords(10, 8)
異なるインターフェイスが同じ名前のメンバをもつことはよくありますので、すべてのインターフェイスの個々のメンバ名のままでは、クラス メンバで名前の衝突が起きてしまう場合があります。 このような場合、メンバ名はインターフェイス名とメソッドをアンダースコアでつなげた メンバ名になります。 例えば、MapClass には AreaOfInterestのメンバと IBasicMap_AreaOfInteret のメンバがあります。

参考情報

Using ArcObjects (COM-based) in .NET

メタデータ

種類

製品