/clr (共通言語ランタイムのコンパイル)
アプリケーションおよびコンポーネントで、共通言語ランタイム (CLR: Common Language Runtime) の機能を使用できるようにします。
/clr[:options]
引数
options
次のスイッチの 1 つまたは複数をコンマで区切って指定します。/clr
アプリケーションのメタデータを作成します。そのメタデータは、他の CLR アプリケーションで使用できます。また、アプリケーションで、他の CLR コンポーネントのメタデータの型およびデータを使用できるようにします。詳細については、次のトピックを参照してください。
/clr:pure
ネイティブの実行可能コードを含まない、Microsoft Intermediate Language (MSIL) のみの出力ファイルを作成します。ただし、MSIL にコンパイルされたネイティブ型が含まれることもあります。詳細については、「純粋なコードと検証可能なコード (C++/CLI)」を参照してください。
/clr:safe
ネイティブの実行可能コードを含まない MSIL のみの、検証可能な出力ファイルを作成します。/clr:safe を指定すると、検査診断 (PEVerify ツール (PEverify.exe)) が有効になります。詳細については、「Writing Verifiably Type-Safe Code」を参照してください。
/clr:oldSyntax
C++ マネージ拡張構文を有効にします。これは、以前の CLR プログラミングの Visual C++ 構文に相当します。C++ マネージ拡張構文の使用は推奨されていません。/clr:oldSyntax は、C++ マネージ拡張を使用するアプリケーションを保守する場合にだけ使用してください。新しいアプリケーションを開発する場合は、変更後の構文を使用してください。詳細については、「ランタイム プラットフォームのコンポーネントの拡張機能」を参照してください。
C++ マネージ拡張アプリケーションがある場合は、プロジェクトを更新することで、新しい構文を使用できます。詳細については、「プログラムの移植とアップグレード」を参照してください。
/clr:noAssembly
アセンブリ マニフェストを出力ファイルに挿入しません。既定では、noAssembly オプションは無効になっています。noAssembly オプションの使用は推奨されていません。代わりに /LN (MSIL モジュールの作成) を使用してください。詳細については、「Deprecated Compiler Options」を参照してください。
マネージ プログラムのマニフェストにアセンブリ メタデータがないときにそのマネージ プログラムをモジュールと呼びます。noAssembly オプションは、モジュールの生成だけに使用できます。/c と /clr:noAssembly を使用してコンパイルする場合は、リンカー フェーズで /NOASSEMBLY オプションを指定してモジュールを作成します。
Visual C++ 2005 以前では、/clr:noAssembly で暗黙に /clr が指定されていました。しかし、/clr で /clr:oldSyntax もサポートされるようになったので、/clr:noAssembly を指定するときは /clr フォームを指定する必要があります。たとえば、/clr:noAssembly /clr は新しい Visual C++ CLR の構文を使用してモジュールを作成し、/clr:noAssembly,oldSyntax は C++ マネージ拡張を使用してモジュールを作成します。
Visual C++ 2005 以前は、/clr:noAssembly と共に /LD を指定する必要がありました。この /LD は、/clr:noAssembly を指定すると暗黙的に指定されるようになりました。
/clr:initialAppDomain
Visual C++ アプリケーションを、CLR の Version 1 で実行できるようにします。initialAppDomain を使用する場合は、Microsoft サポート Web サイトの「BUG: AppDomainUnloaded exception when you use managed extensions for Visual C++ components (バグ: Visual C++ コンポーネントの拡張機能を使用すると AppDomainUnloaded 例外が発生する)」で説明されている問題の一部が発生することがあります。CLR の Version 1 では ASP.NET をサポートしていないため、initialAppDomain を使用してコンパイルされたアプリケーションを、ASP.NET を使用しているアプリケーションでは使用しないでください。
/clr:nostdlib
既定の \clr ディレクトリを無視するようコンパイラに指示します。System.dll などの DLL の複数のバージョンを含めると、コンパイラはエラーを生成します。このオプションを使用すると、コンパイル中に使用する特定のフレームワークを指定できます。
解説
マネージ コードは、CLR によって検査および管理されるコードです。マネージ コードは、マネージ オブジェクトにアクセスできます。詳細については、「/clr の制約」を参照してください。
マネージ型を定義および使用するアプリケーションの開発方法については、「ランタイム プラットフォームのコンポーネントの拡張機能」を参照してください。
/clr を使用してコンパイルされたアプリケーションには、マネージ データがある場合とない場合があります。
マネージ アプリケーションのデバッグを有効にするには、「/ASSEMBLYDEBUG (DebuggableAttribute の追加)」を参照してください。
ガベージ コレクトされたヒープでインスタンス化されるのは CLR 型だけです。詳細については、「クラスと構造体 (C++ コンポーネント拡張)」を参照してください。関数をネイティブ コードにコンパイルするには、unmanaged プラグマを使用します。詳細については、「managed, unmanaged」を参照してください。
既定では、/clr は無効です。/clr が有効な場合は /MD も有効です 詳細については、「/MD、/MT、/LD (ランタイム ライブラリの使用)」を参照してください。/MD は、動的にリンクされるマルチスレッド バージョンのランタイム ルーチンが標準ヘッダー (.h) ファイルから選択されるようにします。マネージ プログラミングでマルチスレッドが必要なのは、CLR のガベージ コレクターが、補助スレッドでファイナライザーを実行するためです。
/c を使用してコンパイルする場合は、/CLRIMAGETYPE で結果の出力ファイルの CLR 型 (IJW、safe、または pure) を指定できます。
/clr は、/EHa を暗黙に指定するので、それ以外の /EH オプションを /clr と共に指定することはできません。詳細については、「/EH (例外処理モデル)」を参照してください。
ファイルの CLR イメージのタイプを判断する方法については、「/CLRHEADER」を参照してください。
リンカーの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD または /LD) を使用してコンパイルされている必要があります。
/ASSEMBLYRESOURCE リンカー オプションを使用して、アセンブリにリソースを埋め込みます。/DELAYSIGN、/KEYCONTAINER、および /KEYFILE の各リンカー オプションでも、アセンブリの作成方法をカスタマイズできます。
/clr が使用されているときは、_MANAGED シンボルが 1 に定義されます。詳細については、「定義済みマクロ」を参照してください。
最初にネイティブなオブジェクト ファイルのグローバル変数が (実行可能ファイルが DLL の場合は DllMain の実行中に) 初期化され、その後でマネージ セクションのグローバル変数が (いずれかのマネージ コードが実行される前に) 初期化されます。#pragmainit_seg は、マネージ カテゴリ内およびアンマネージ カテゴリ内での初期化の順序にのみ影響します。
/clr:safe を使用してコンパイルすることは、C# などの言語において /platform:anycpu を使用してコンパイルすることに似ています。
安全なイメージと純粋なイメージ
純粋なイメージは C ランタイム (CRT) ライブラリの CLR バージョンを使用します。ただし、CRT は検証できないので、/clr:safe を使用したコンパイルでは CRT は使用できません。詳細については、「CRT ライブラリの機能」を参照してください。
純粋なイメージに表示できないネイティブ コードには、インライン アセンブリ、setjmp、longjmp などがあります。
純粋なイメージまたは安全なイメージの各エントリ ポイントはマネージになります。/clr を使用してコンパイルすると、エントリ ポイントはネイティブになります。詳細については、「__clrcall」を参照してください。
/clr:safe を使用してコンパイルすると、変数は既定で appdomain になり、プロセスごとに設定できません。/clr:pure を使用すると、appdomain が既定になりますが、process 変数を使用できます。
/clr または /clr:pure を使用してコンパイルされた 32 ビットの .exe ファイルを、64 ビット オペレーティング システムで実行すると、アプリケーションは WOW64 で実行されるため、32 ビット アプリケーションを 64 ビット オペレーティング システム上の 32 ビット CLR で実行できます。既定では、/clr:safe を使用してコンパイルされた .exe ファイルは、64 ビット オペレーティング システムを実行しているコンピューターの 64 ビット CLR で実行されます (32 ビット オペレーティング システムでは同じ .exe ファイルが 32 ビット CLR で実行されます)。ただし、安全なアプリケーションで 32 ビット コンポーネントを読み込むことができます。この場合、オペレーティング システムの 64 ビット サポートで実行している安全なイメージで 32 ビット アプリケーションを読み込もうとすると失敗します (BadFormatException)。安全なイメージが 32 ビット イメージを 64 ビット オペレーティング システムに読み込む場合に失敗せずに実行し続けるためには、/CLRIMAGETYPE を使用してメタデータ (.corflags) を変更し、WOW64 で実行するようにマークする必要があります。コマンド ラインの例を次に示します (独自のエントリ シンボルと置き換えてください)。
cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console
装飾名の取得方法については、「リスティング ファイルを出力して装飾名を確認する」を参照してください。64 ビット プログラミングの詳細については、「64 ビットの設定のプログラム (Visual C++)」を参照してください。
サンプル、チュートリアル、および詳細については、以下を参照してください。
メタデータと名前のないクラス
メタデータでは、名前のないクラスが $UnnamedClass$crc-of-current-file-name$index$ として表されます。index は、コンパイルで見つかった名前のないクラスの数を表し、順次カウントされます。次のコードでは、名前のないクラスをメタデータに生成します。
// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;
メタデータを表示するには、ildasm.exe を使用します。
このコンパイラ オプションを Visual Studio で使用するには
ソリューション エクスプローラーでプロジェクト名を右クリックし、[プロパティ] をクリックして、プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。
[構成プロパティ] フォルダーを選択します。
[全般] プロパティ ページで、[共通言語ランタイム サポート] プロパティを変更します。
[!メモ]
/clr が [プロパティ ページ] ダイアログ ボックスで有効になっている場合は、/clr と互換性のないコンパイラ オプション プロパティも必要に応じて調整されます。たとえば、/RTC が設定された後で /clr が有効になった場合、/RTC はオフになります。
また、/clr アプリケーションをデバッグする場合、[デバッガーのタイプ] プロパティを [混合] または [マネージのみ] に設定します。詳細については、「C++ デバッグ構成のプロジェクト設定」を参照してください。
モジュールを作成する方法については、「/NOASSEMBLY (MSIL モジュールの作成)」を参照してください。
このコンパイラ オプションをコードから設定するには
- CompileAsManaged を参照してください。