ObjectARX のクラスと .NET の同等のクラスにはいくつかはっきりとした違いがあります。これらの違いにより、わずかですが重要なコード手法の変更が必要です。
次のセクションでは、マネージ ラッパー クラスを使用する際の一般的な提案を説明します。
C++ は、リソースのクリーン アップにデストラクタを使用します。ObjectARX マネージ ラッパーは、IDisposable インタフェースを実装して同じことを行います。マネージ ラッパーは、共通の基本クラス DisposableWrapper から派生させます。その目的は、アンマネージ メモリを管理することです。
ObjectARX マネージ ラッパー クラスによって使用される基礎となるリソースがアンマネージ クラスであることから、マネージ ラッパーで Dispose をアクティブに呼び出す必要があります。このようにすると、基本タイプによって所有されているリソースが、階層全体で解放されます。アンマネージ リソースによって使用されるメモリを解放する場合に、.NET ガベージ コレクションを当てにしないでください。
ObjectARX マネージ ラッパーは、ユーザが C++ オブジェクトにアクセスするたびに同じ .NET オブジェクトを受けとるという保証はしません。たとえば、データベースで続けて 2 回同じオブジェクトを開いても、2 つの異なるラッパーとなります。ただし、DisposableWrapper (ObjectARX マネージ ラッパーの共通の基本クラス)は、Equals と GetHashCode よりも優先されます。Equals は基本となるアンマネージ ポインタを比較し、GetHashCode は基本となるアンマネージ ポインタを返します。これにより、実際には、.NET クライアントがこの 2 つの異なるラッパー オブジェクトを同一であると判断することが保証されます。
ObjectARX は、関数の戻り値を使用してエラー条件を示します。.NET でエラーを知らせる方法として好ましいのは、例外を発生させることです。ObjectARX マネージ ラッパーは、ObjectARX エラー コードを例外に変換します。いくつかのエラー コードは、.NET ネイティブ例外にマッピングされ、他のエラーはマネージ ラッパーによって公開されたカスタム例外タイプにマッピングされます。
オブジェクトのプロパティは、C++ では get メソッドと set メソッドとしてモデル化されます。一方、.NET は、プロパティを実行環境のプライマリ抽象にします。ObjectARX マネージ ラッパーは、get メソッドと set メソッドを適切に .NET プロパティにマッピングします。
ObjectARX は、イベントのモデル化にリアクタを使用します。.NET はイベントをプライマリ抽象にすることから、ObjectARX マネージ ラッパーはリアクタをイベントにマッピングします。
アンマネージ リアクタには、イベント ソース クラスと抽象リアクタ クラスの 2 つのクラスが必要です。イベント ソース クラスは、システムによってインスタンス化され、addReactor() 関数と removeReactor() 関数を公開します。クライアントは、抽象的リアクタから具体的リアクタを派生させ、具体的リアクタをインスタンス化し、これをイベント ソースに追加します。イベント ソースは、イベントが発生すると、具体的リアクタ内の仮想関数を呼び出します。
ObjectARX マネージ ラッパーは、リアクタ パターンを、マネージ イベントとともに 1 つのイベント ソース クラスとしてモデル化します。
ObjectARX では、反復メソッドはクラス全体で標準化されません。マネージ ラッパーの場合、2 つのインタフェースが反復を一貫性のあるものにします。コレクションは、IEnumerable を実装します。GetEnumerator によって返された反復子が、IEnumerator を実装します。
ダイナミック オブジェクトで明示的に GetEnumerator メソッドを呼び出したら、次にそれを明示的に破棄する必要があります。次のコード例を参照してください。
Database db = HostApplicationServices.WorkingDatabase; dynamic dynamicDb = HostApplicationServices.WorkingDatabase; var lineTypeTable = dynamicDb.LinetypeTableId; var stEnumerator = lineTypeTable.GetEnumerator(); stEnumerator.Dispose();
ObjectARX では、拡張アプリケーションがコマンドを AutoCAD に登録することを許可します。この登録は暗黙的です。アプリケーションは、登録するコマンドを見つけ出すために、実行される必要があります。
.NET は、アプリケーションに、宣言型スタイルを使用してその動作を定義するように働き掛けます。ObjectARX マネージ ラッパーは、コマンドの登録を宣言型にします。コマンド メソッドを示すために、カスタム属性が使用されます。コード例や詳細情報は、「コマンド定義(.NET)」を参照してください。
グローバル関数は ObjectARX マネージ ラッパーには存在しないので、ObjectARX グローバル関数の多くは新しい .NET オブジェクトまたは既存のオブジェクト上の新しいプロパティにマッピングされます。
たとえば、1 グループの ObjectARX グローバル関数は、アプリケーションによって AutoCAD のコマンド プロンプトとの対話に使用されます。ObjectARX マネージ ラッパーでは、新しい CommandLinePrompt クラスがこの機能をカプセル化します。
ObjectARX グローバル関数の別のカテゴリは、インスタンス オブジェクトにポインタを返します。たとえば、ObjectARX は、ポインタを AcDbTransactionManager に返す場合に acdbTransactionManagerPtr() を使用します。このような関数は .NET ではオブジェクト プロパティにマッピングされているため、データベースは TransactionManager プロパティを持つようになりました。