中間言語とネイティブコードの混在
アセンブリの種類を設定する
.NET Framework 対応アプリケーションを開発するということは、共通中間言語を含む実行ファイルを生成するということです。従来の C++ コンパイラは、コンパイラが対象とするプラットフォームのマシン語で構成される実行可能ファイルを生成しましたが、Visual C++ のプロジェクトでは .NET Framework 専用のアプリケーションを開発することができます。これは、すなわち共通中間言語を含む実行ファイルが出力されるということです。
C++ 言語は、.NET Framework 専用に設計された C# や Visual Basic .NET とは異なり、ネイティブ環境に特化している C++ 言語との融和が特徴的です。C# 言語の場合は .NET Framework の共通中間言語、すなわちマネージコードが記述されることが前提となっているため、基本データ型や新しく定義するクラスは全て .NET Framework 上のマネージコードになります。C# からネイティブコードにアクセスすることは可能ですが、そうしたプログラムには特別な記述が必要となります。
一方 C++ はこの逆で、これまで通りに関数やクラスを記述した場合はネイティブコードとなり、拡張言語仕様で定められている新しいキーワードを用いて明示的にマネージコードであることを明記することで共通中間言語を生成できます。このため、C++ 言語で生成した実行ファイルは純粋なマシン語であるネイティブコードと、.NET Framework の共通言語ランタイムが認識できるマネージコードを混在させることができます。
より正確には、Visual C++ のコンパイラには共通中間言語の生成に関するコンパイラオプションが存在します。デフォルトでは純粋なマシン語のアンマネージコードと .NET Framework のマネージコードを混在させる混在アセンブリでコンパイルされます。この他にマネージコードのみで構成される純粋アセンブリ 、アンマネージ型も許可しない検証可能アセンブリの 3 つがあります。
名前 | コンパイラ オプション | アンマネージ型 | マネージ型 | アンマネージコード | マネージコード |
---|---|---|---|---|---|
ネイティブ | 無し | ○ | × | ○ | × |
Mixed 混在アセンブリ |
/clr | ○ | ○ | ○ | ○ |
Pure 純粋アセンブリ |
/clr:pure | ○ | ○ | × | ○ |
Verifiable 検証可能アセンブリ |
/clr:safe | × | ○ | × | ○ |
C# 言語で生成するような完全な .NET Framework アプリケーションを開発することが目的であれば検証可能アセンブリでコンパイルすることが望まれます。この場合は、共通言語ランタイムがコードを検証してセキュリティの条件に適合するかどうかを調べます。また、純粋アセンブリの場合もマネージとアンマネージ間の遷移処理が不要になるため、パフォーマンスの向上が期待できます。この場合、プラットフォーム呼び出しによって、既存のネイティブコードを呼び出すことは可能です。
ただし、純粋アセンブリや検証可能アセンブリはアンマネージコードを含むことができないので、従来の C++ 言語で作成した資産を再利用することができません。既存製品や再利用可能なライブラリを使いながら .NET アプリケーションに移行するような場合には混在アセンブリを使うべきでしょう。本稿では混在アセンブリでコンパイルすることを前提として話を進めますが、新しく .NET アプリケーションを開発することが目的ならば純粋アセンブリや検証可能アセンブリでも問題はありません。