/clr (共通言語ランタイムのコンパイル)
更新 : 2007 年 11 月
アプリケーションおよびコンポーネントで、共通言語ランタイム (CLR: Common Language Runtime) の機能を使用できるようにします。
/clr[:options]
引数
options
次の 1 つ以上をコンマで区切って指定します。/clr
アプリケーションのメタデータを作成して、他の CLR アプリケーションで使用できるようにします。また、アプリケーションで、他の CLR コンポーネントのメタデータの型およびデータを使用できるようにします。詳細については、次のトピックを参照してください。
/clr:pure
ネイティブの実行可能コードを含まない、MSIL のみの出力ファイルを作成します。ただし、MSIL にコンパイルされたネイティブ型が含まれることもあります。詳細については、「純粋なコードと検証可能なコード」を参照してください。
/clr:safe
ネイティブの実行可能コードを含まない MSIL のみの、検証可能な出力ファイルを作成します。/clr:safe によって検査診断 (PEVerify ツール (Peverify.exe)) が有効になります。詳細については、「検証可能なタイプ セーフ コードの作成」を参照してください。
/clr:oldSyntax
C++ マネージ拡張構文を有効にします。これは、以前の CRL プログラミングの Visual C++ 構文に相当します。注意Microsoft Visual C++ 2005 では、C++ 構文のマネージ拡張の使用は推奨されていません。/clr:oldSyntax は、C++ マネージ拡張を使用する Visual C++ アプリケーションを保守する場合にだけ使用してください。新しいアプリケーションを開発する場合は、変更後の構文を使用してください。詳細については、「New C++ Language Features」を参照してください。
C++ マネージ拡張アプリケーションを使用している場合は、プロジェクトを移植して、新しい構文を使用できます。詳細については、「プログラムの移植とアップグレード」を参照してください。
/clr:noAssembly
noAssembly オプションは、アセンブリ マニフェストを出力ファイルに挿入しないように指定します。既定では、noAssembly オプションは無効になっています。注意 Visual C++ 2005 では、noAssembly オプションの使用は推奨されていません。代わりに /LN (MSIL モジュールの作成) を使用してください。詳細については、「Visual C++ 2005 で使用を推奨されていないコンパイラ オプション」を参照してください。
マネージ プログラムのマニフェストにアセンブリ メタデータがないときにそのマネージ プログラムをモジュールと呼びます。noAssembly オプションは、モジュールの生成だけに使用できます。/c (リンクを行わないコンパイル) と /clr:noAssembly を指定してコンパイルする場合は、リンカ フェーズで /NOASSEMBLY (MSIL モジュールの作成) オプションを指定してモジュールを作成します。
Visual C++ 2005 以前では、/clr:noAssembly で暗黙に /clr が指定されていました。しかし、/clr で /clr:oldSyntax もサポートされるようになったので、/clr:noAssembly を指定するときは /clr フォームを 1 つ指定する必要があります。たとえば、/clr:noAssembly /clr は新しい Visual C++ CLR の構文を使用してモジュールを作成し、/clr:noAssembly,oldSyntax は C++ マネージ拡張を使用してモジュールを作成します。
Visual C++ 2005 以前は /clr:noAssembly と共に /LD を指定する必要がありました。この /LD は、/clr:noAssembly を指定すると暗黙に指定されるようになりました。
/clr:initialAppDomain
Visual C++ アプリケーションを、共通言語ランタイムの Version 1 で実行できます。initialAppDomain を使用する場合は、サポート技術情報の文書 Q309694 で説明されている問題の一部が発生することがあります。サポート技術情報の文書は、MSDN ライブラリ メディアまたは https://support.microsoft.com/support/ で参照できます。initialAppDomain を指定してコンパイルされたアプリケーションは、ASP.NET を使用しているアプリケーションでは使用しないでください。ASP.NET を C++ で動作させるには、新しいランタイムにアップグレードしてください。
解説
マネージ コードは、共通言語ランタイムによって検査および管理されるコードです。マネージ コードは、マネージ オブジェクトにアクセスできます。
「/clr の制約」も参照してください。
マネージ型を定義および使用するアプリケーションの開発方法については、「New C++ Language Features」を参照してください。
/clr を指定してコンパイルされたアプリケーションには、マネージ データがある場合とない場合があります。
マネージ アプリケーションをデバッグするには、「/ASSEMBLYDEBUG (DebuggableAttribute の追加)」を参照してください。
ガベージ コレクトされたヒープでインスタンス化されるのは CLR 型だけです。詳細については、「Classes and Structs (Managed)」を参照してください。関数をネイティブ コードにコンパイルするには、unmanaged プラグマを使用します。詳細については、「managed, unmanaged」を参照してください。
既定では、/clr は無効です。/clr が有効の場合は /MD も有効です (詳細については、「/MD」を参照してください)。/MD によって、動的にリンクされるマルチスレッド バージョンのランタイム ルーチンが標準ヘッダー (.h) ファイルから選択されます。マネージ プログラミングでマルチスレッドが必要な理由としては、CLR のガベージ コレクタが、補助スレッドでファイナライザを実行することなどが考えられます。
/c を指定してコンパイルする場合は、/CLRIMAGETYPE (CLR イメージのタイプの指定) で結果の出力ファイルの CLR 型 (IJW、safe、または pure) を指定できます。
/clr は、/EHa を暗黙に指定するので、それ以外の /EH オプションを /clr と共に指定することはできません。詳細については、「/EH (例外処理モデル)」を参照してください。
ファイルの CLR イメージのタイプを判断する方法については、「/CLRHEADER」を参照してください。
リンカの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD または /LD) を指定してコンパイルされている必要があります。
/ASSEMBLYRESOURCE (マネージ リソースの埋め込み) リンカ オプションを使用して、アセンブリにリソースを埋め込みます。/DELAYSIGN (アセンブリの部分署名)、/KEYCONTAINER (アセンブリに署名するためのキー コンテナの指定)、および /KEYFILE (アセンブリに署名するためのキーまたはキー ペアの指定) の各リンカ オプションでも、アセンブリの作成方法をカスタマイズできます。
/clr が使用されている場合、_MANAGED シンボルが 1 に定義されます。詳細については、「Predefined Macros」を参照してください。
最初に (実行可能ファイルが DLL の場合は DllMain の実行中に)、ネイティブなオブジェクト ファイルのグローバル変数が初期化され、次にマネージ セクションのグローバル変数が (任意のマネージ コードを実行する前に) 初期化されます。#pragmainit_seg は、マネージ カテゴリおよびアンマネージ カテゴリ内での初期化の順序だけに影響します。
/clr:safe でコンパイルすることは、C# などの言語において /platform:anycpu でコンパイルすることに似ています。
安全なイメージと純粋なイメージ
純粋なイメージは C ランタイム ライブラリの CLR バージョンを使用します。ただし、CRT は検証できないので、/clr:safe を指定したコンパイルでは CRT は使用できません。詳細については、「C ランタイム ライブラリ」を参照してください。
純粋なイメージに表示できないネイティブ コードには、インライン アセンブリ、setjmp、longjmp などがあります。
純粋なイメージまたは安全なイメージの各エントリ ポイントはマネージになります。/clr を指定してコンパイルすると、エントリ ポイントはネイティブになります。詳細については、「__clrcall」を参照してください。
/clr:safe を指定してコンパイルすると、変数は既定で appdomain になり、プロセスごとに設定できません。/clr:pure を指定すると、appdomain が既定になりますが、process 変数を使用できます。
/clr または /clr:pure を指定してコンパイルされた 32 ビットの .exe を、64 ビット オペレーティング システムで実行すると、アプリケーションは WOW64 で実行されるため、32 ビット CLR によって 32 ビット アプリケーションを 64 ビット オペレーティング システム上で実行できます。既定では、/clr:safe を指定してコンパイルされた .exe は、64 ビット オペレーティング システムを実行しているコンピュータの 64 ビット CLR で実行されます (32 ビット オペレーティング システムでは同じ .exe が 32 ビット CLR で実行されます)。ただし、お使いの安全なアプリケーションで 32 ビット コンポーネントを読み込むことができます。この場合、オペレーティング システムの 64 ビット サポートで実行している安全なイメージで 32 ビット アプリケーションを読み込もうとすると失敗します (BadFormatException)。安全なイメージが 32 ビット イメージを 64 ビット オペレーティング システムに読み込む場合に失敗せずに実行し続けるためには、/CLRIMAGETYPE (CLR イメージのタイプの指定) を使用してメタデータ (.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 with: /clr /LD
class {} x;
メタデータを表示するには、ildasm.exe を使用します。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[構成プロパティ] フォルダをクリックします。
[全般] プロパティ ページをクリックします。
[共通言語ランタイム サポート] プロパティを変更します。
モジュールを作成する方法については、「/NOASSEMBLY (MSIL モジュールの作成)」を参照してください。
メモ : /clr がプロジェクトの [プロパティ ページ] ダイアログ ボックスで有効になっている場合は、/clr と互換性のないコンパイラ オプション プロパティも必要に応じて調整されます。たとえば、/RTC が設定された後で /clr が有効になった場合、/RTC はオフになります。
また、/clr アプリケーションをデバッグする場合、[デバッガのタイプ] プロパティを [混合] または [マネージのみ] に設定する必要があります。詳細については、「C++ デバッグ構成のプロジェクト設定」を参照してください。
このコンパイラ オプションをコードから設定するには
- CompileAsManaged を参照してください。