C++ 構文のマネージ拡張のアップグレード チェックリスト
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]
Visual C++ 2005 では、Visual C++ に、.NET Framework などのガベージ コレクションを備えた仮想マシンをターゲット指定するための機能が組み込まれました。 Visual C++ 2008 では、C++ マネージ拡張のサポートの使用は推奨されなくなりました。将来のリリースで削除される予定です。
C++ のマネージ拡張を使用するコードは、従来どおり /clr:oldSyntax を使ってコンパイルできます。 詳細については、「/clr (Common Language Runtime Compilation)」を参照してください。新しい構文の使い方の詳細については、次のトピックを参照してください。
このトピックでは、C++ のマネージ拡張と新しい Visual C++ 構文の構文上の相違点について説明します。
C++ コードのマネージ拡張を更新するには
#using <mscorlib.dll> を削除します (現在、このアセンブリが既定で参照されます)。
__gc class を ref class に置き換えます。
__gc struct を ref struct に置き換えます。
__value class を value class に置き換えます。
__value struct を value struct に置き換えます。
値クラスから既定のコンストラクターを削除します (値型の既定のコンストラクターは、C++ のマネージ拡張で使用できますが、CLR の性質上、これらを信頼性を持って呼び出すことができないため、この機能は削除されました)。
参照と値型の詳細については、「Classes and Structs (Managed)」を参照してください。
- __gc __interface を interface class に置き換えます。
インターフェイス キーワードの詳細については、「interface class」を参照してください。
__abstract を abstract に置き換えて、クラス名の後に移動します。 詳細については、abstract (Visual C++) を参照してください。
__sealed を sealed に置き換えて、クラス名の後に移動します。 詳細については、sealed を参照してください。
__property を property に置き換えて、get メソッドと set メソッドを組み合わせて 1 つのプロパティ ブロックを作成し、これらのアクセサーから末尾のアンダースコアまたは名前のサフィックスを削除します。 単純なプロパティの場合、アクセサーを明示的に定義する必要はありません。 インデックス付きのプロパティの構文では、プロパティ型の後に対の角かっこを指定する必要があります。 詳細については、「How to: Use Simple Properties」および「How to: Use Indexed Properties」を参照してください。
__event を event (Visual C++) に置き換えます。
__value enum を enum class に置き換えます。
後続する参照型へのポインター (__gc* で定義される) を ^ に置き換えます。 詳細については、^ (Handle to Object on Managed Heap) を参照してください。
ガベージ コレクション ヒープ内に存在する可能性がある値型へのポインターを interior_ptr に置き換えます。
オブジェクト全体が固定されていない場合、__pin で宣言されたポインターを pin_ptr のインスタンスに置き換えます。この場合、interior_ptr を使用し、次に、内部ポインター上の pin_ptr を使用します。 Visual C++ 2005 では、このテンプレートは cli Namespace で定義されています。
new を gcnew に置き換えます。
ガベージ コレクション ヒープへのポインターまたはハンドルがオブジェクトを指していないことを示すために使用する場合、および比較を使用してポインターとハンドルをチェックする場合は、0 または null を nullptr に置き換えます。
array (Visual C++) 型を使用するために、__gc[] で宣言されたガベージ コレクション配列を更新します。 Visual C++ 2005 では、このテンプレートは cli Namespace で定義されています。
__box のすべてのインスタンスを削除します。 詳細については、Implicit Boxing を参照してください。
"S" プリフィックスを文字列リテラルから削除します (コンパイラは、文字列が使用されるコンテキストに基づいて、文字列がリテラルかどうかを判断するようになりました)。
op_Addition や op_Subtraction などの C++ マネージ拡張に必要な明示的な宣言とオーバーロードされた演算子の使用を、従来の C++ 構文に置き換えます。 詳細については、「User-Defined Operators」および「Operator Overloading」を参照してください。
C++ マネージ拡張構文の op_Implicit および op_Explicit を使用する変換演算子を更新します。詳細については、User-Defined Conversions を参照してください。
__try_cast を safe_cast に置き換えます。 Visual C++ 2005 では、このテンプレートは cli Namespace で定義されています。
CLR のアセンブリ署名の属性を使用してアセンブリに署名 (つまり、アセンブリに厳密な名前を指定) した場合は、これらの属性をコードから削除し、代わりにアセンブリ署名のリンカー オプションを使用する必要があります。 詳細については、厳密名アセンブリ (アセンブリ署名) を参照してください。