/clr (共通言語ランタイムのコンパイル)

アプリケーションとコンポーネントで共通言語ランタイム (CLR) の機能を使用できるようにし、C++/CLI コンパイルを有効にします。

構文

/clr[:<オプション>]

引数

options
次の 1 つまたは複数の引数を、コンマで区切って指定します。

  • なし

    オプションを指定しない場合は、/clr によってコンポーネントのメタデータが作成されます。 このメタデータは、他の CLR アプリケーションで使用できます。また、このメタデータによって、他の CLR コンポーネントのメタデータの型とデータをコンポーネントで使用できるようになります。 「混在 (ネイティブおよびマネージド) アセンブリ」を参照してください。

  • netcore

    Visual Studio 2019 バージョン 16.4 以降で使用できる /clr:netcore を使うと、最新のクロスプラットフォーム .NET Framework (別名 .NET Core) を使用したコンポーネントのメタデータとコードを作成できます。 このメタデータは、他の .NET Core アプリケーションで使用できます。 また、このオプションを使うと、コンポーネントで他の .NET Core コンポーネントのメタデータ内の型とデータを使用できます。

  • nostdlib

    既定の \clr ディレクトリを無視するようにコンパイラに指示します。 System.dll などの DLL の複数のバージョンを含めると、コンパイラはエラーを生成します。 このオプションを使うと、コンパイル時に使用する特定のフレームワークを指定できます。

  • pure

    /clr:pure は非推奨です。 このオプションは、Visual Studio 2017 以降で削除されます。 純粋 MSIL にする必要があるコードは、C# に移植することをお勧めします。

  • safe

    /clr:safe は非推奨です。 このオプションは、Visual Studio 2017 以降で削除されます。 安全 MSIL にする必要があるコードは、C# に移植することをお勧めします。

  • noAssembly

    /clr:noAssembly は非推奨です。 代わりに、/LN (MSIL モジュールの作成) を使用してください。

    アセンブリ マニフェストを出力ファイルに挿入しないようコンパイラに指示します。 既定では、noAssembly オプションはオフです。

    マニフェストにアセンブリ メタデータがないマネージド プログラムを、"モジュール" と呼びます。 noAssembly オプションは、モジュールを生成するときのみ使用できます。 /c/clr:noAssembly を使ってコンパイルする場合は、リンカーのフェーズで /NOASSEMBLY オプションを指定してモジュールを作成します。

    Visual Studio 2005 より前では、/clr:noAssembly/LD が必要でした。 現在は、/clr:noAssembly を指定すると /LD が暗黙的に指定されるようになっています。

  • initialAppDomain

    initialAppDomain は古い形式です。 C++/CLI アプリケーションを CLR の Version 1 で実行できるようにします。 initialAppDomain を使ってコンパイルしたアプリケーションを、ASP.NET を使用しているアプリケーションでは使用しないでください。CLR の Version 1 ではサポートされていないためです。

解説

"マネージド コード" は、CLR によって検査および管理できるコードです。 マネージド コードはマネージド オブジェクトにアクセスできます。 詳細については、「/clr の制約」を参照してください。

C++ でマネージド型を定義および使用するアプリケーションの開発方法については、ランタイム プラットフォームのコンポーネントの拡張機能に関する記事を参照してください。

/clr を使用してコンパイルされたアプリケーションには、マネージド データがある場合とない場合があります。

マネージド アプリケーションでのデバッグを有効にするには、「/ASSEMBLYDEBUG (DebuggableAttribute の追加)」を参照してください。

ガベージ コレクションが実行されたヒープでインスタンス化されるのは CLR 型のみです。 詳細については、「クラスと構造体」を参照してください。 関数をネイティブ コードにコンパイルするには、 unmanaged プラグマを使用します。 詳細については、「 managed」と「 unmanagedの両方を管理できます。

既定では、/clr は無効です。 /clr が有効な場合は、/MD も有効です。 詳細については、「/MD/MT/LD (ランタイム ライブラリの使用)」を参照してください。 /MD を使用すると、動的にリンクされるマルチスレッド バージョンのランタイム ルーチンが標準ヘッダー ファイルから選択されるようになります。 マネージド プログラミングでマルチスレッドが必要なのは、CLR のガベージ コレクターが、補助スレッドでファイナライザーを実行するためです。

/c を使用してコンパイルする場合は、/CLRIMAGETYPE リンカー オプションを使って、生成される出力ファイルの CLR 型を指定できます。

/clr/EHa を暗黙的に指定するため、/clr では他の /EH オプションを指定できません。 詳細については、「/EH (例外処理モデル)」を参照してください。

ファイルの CLR イメージの型を判断する方法については、「/CLRHEADER」を参照してください。

リンカーの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD または /LD) を使用してコンパイルされている必要があります。

/ASSEMBLYRESOURCE リンカー オプションを使用して、アセンブリにリソースを埋め込みます。 /DELAYSIGN/KEYCONTAINER/KEYFILE の各リンカー オプションでも、アセンブリの作成方法をカスタマイズできます。

/clr が使用されるときは、_MANAGED シンボルは 1 に定義されます。 詳細については、「定義済みマクロ」を参照してください。

最初にネイティブなオブジェクト ファイルのグローバル変数が (実行可能ファイルが DLL の場合は DllMain の実行中に) 初期化され、その後でマネージド セクションのグローバル変数が (いずれかのマネージド コードが実行される前に) 初期化されます。 #pragma init_seg は、マネージド カテゴリ内およびアンマネージド カテゴリ内での初期化の順序にのみ影響を与えます。

メタデータと名前のないクラス

名前のないクラスは、$UnnamedClass$<crc-of-current-file-name>$<index>$ のような名前でメタデータに表示されます。ここで <index> は、コンパイル時に名前のないクラスに与えられる連続番号です。 次のコードの例では、名前のないクラスをメタデータに生成します。

// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;

メタデータを表示するには、ildasm.exe を使用します。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成] ドロップダウンを [すべての構成] に設定し、[プラットフォーム] ドロップダウンを [すべてのプラットフォーム] に設定します。

  3. [構成プロパティ]>[C/C++]>[全般] ページを選択します。

  4. [共通言語ランタイム サポート] プロパティを変更します。 [OK] を選択して変更を保存します。

Note

Visual Studio IDE では、[プロパティ ページ] ダイアログの [構成プロパティ]>[C/C++]>[全般] ページで、/clr コンパイラ オプションを個別に設定できます。 ただし、CLR テンプレートを使ってプロジェクトを作成することをお勧めします。 これにより、CLR コンポーネントの正常な作成に必要なすべてのプロパティが設定されます。 これらのプロパティを設定するもう 1 つの方法は、[プロパティ ページ] ダイアログの [構成プロパティ]>[詳細] ページで、[共通言語ランタイム サポート] プロパティを使用することです。 このプロパティを使うと、その他のすべての CLR 関連ツール オプションを一度に設定できます。

このコンパイラ オプションをコードから設定するには

関連項目

MSVC コンパイラ オプション
MSVC コンパイラ コマンド ラインの構文