/clrの使用に関する次の制限事項に注意してください。
構造化例外ハンドラーでは、
/clrでコンパイルする際の_allocaの使用に関する制限事項があります。 詳細については、_allocaを参照してください。/clrでは実行時エラー チェックは使用できません。 詳細については、「方法: ネイティブ ランタイム チェックを使用する」をご覧ください。/clrを使用して標準の C++ 構文のみを使用するプログラムをコンパイルする場合は、インライン アセンブリの使用に次のガイドラインが適用されます。ネイティブ スタック レイアウト、現在の関数の外部の呼び出し規則、またはコンピューターに関するその他の低レベルの情報に関する知識を想定しているインライン アセンブリ コードは、その知識がマネージド関数のスタック フレームに適用される場合、エラーになる可能性があります。 インライン アセンブリ コードを含む関数は、
/clrなしでコンパイルされた別のモジュールに配置されたかのように、アンマネージ関数として生成されます。コピーで構築された関数のパラメーターを渡す関数内のインライン アセンブリ コードはサポートされていません。
/clrでコンパイルされたプログラムからvprintf系関数を呼び出すことはできません。naked__declspec修飾子は、/clrでは無視されます。_set_se_translatorによって設定されたトランスレーター関数は、アンマネージ コードの catch にのみ影響します。 詳細については、例外処理に関するページを参照してください。/clrでは、関数ポインターの比較は許可されません。/clrでは、完全なプロトタイプ関数以外の関数は使用できません。/clrでは、次のコンパイラ オプションはサポートされていません。/EHscおよび/EHs(/clrでは/EHaが暗黙的に指定されます (「/EH(例外処理モデル)」を参照))/fp:strictおよび/fp:except(「/fp(浮動小数点に関する動作の指定)」を参照)
_STATIC_CPPLIBプリプロセッサの定義 (/D_STATIC_CPPLIB) と/clrコンパイラ オプションの組み合わせはサポートされていません。 この定義により、アプリケーションが、サポートされていない静的なマルチスレッド C++ 標準ライブラリとリンクされるためです。 詳細については、「/MD、/MT、/LD(ランタイム ライブラリの使用)」を参照してください。/clrで/Ziを使用する場合、パフォーマンスに影響があります。 詳細については、/Ziを参照してください。/Zc:wchar_tを一緒に指定せずに、またはこの文字を_wchar_tにキャストせずに、ワイド文字を .NET Framework 出力ルーチンに渡すと、出力がunsigned short intとして表示されます。 次に例を示します。Console::WriteLine(L' ') // Will output 32. Console::WriteLine((__wchar_t)L' ') // Will output a space.関数が
#pragma unmanaged下にない場合、または関数をネイティブ コードとしてコンパイルする必要がある場合、/clrでコンパイルすると/GSは無視されます。この場合、コンパイラで警告 C4793 が生成され、これは既定ではオフになります。マネージド アプリケーションの関数シグネチャの要件については、
/ENTRYを参照してください。/openmpおよび/clrでコンパイルされたアプリケーションは、1 つの appdomain プロセスでのみ実行できます。 詳細については、/openmp(OpenMP 2.0 サポートの有効化) に関するページを参照してください。可変個引数 (vararg) を受け取る関数は、ネイティブ関数として生成されます。 可変個引数の位置にあるすべてのマネージド データ型は、ネイティブ型にマーシャリングされます。 System.String 型は、いずれも実際にはワイド文字の文字列ですが、1 バイト文字の文字列にマーシャリングされます。 したがって、
printf指定子が%S(wchar_t*) である場合、代わりに%s文字列にマーシャリングされます。va_argマクロを使用する場合、/clr:pureでコンパイルすると予期しない結果が生じる可能性があります。 詳細については、「va_arg、va_copy、va_end、va_start」を参照してください。/clr:pureおよび/clr:safeコンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 以降ではサポートされていません。 "純粋" または "安全" でなければならないコードは C# に移植する必要があります。マネージド コードからパラメーター情報 (関数の引数) を取得するためにスタックを調べる関数を呼び出さないでください。 P/Invoke レイヤーにより、その情報がスタックのさらに下位に移動します。 たとえば、
/clrでプロキシ/スタブをコンパイルしないでください。関数は、可能な限りマネージド コードにコンパイルされますが、すべての C++ コンストラクトをマネージド コードに変換できるわけではありません。 この判断は関数ごとに行われます。 関数のいずれかの部分をマネージド コードに変換できない場合は、代わりに関数全体がネイティブ コードに変換されます。 次の場合は、コンパイラでマネージド コードが生成されません。
コンパイラによって生成されたサンクまたはヘルパー関数。 仮想関数呼び出しなど、関数ポインターを介したすべての関数呼び出しで、ネイティブ サンクが生成されます。
setjmpまたはlongjmpを呼び出す関数。特定の組み込みルーチンを使用して、マシン リソースを直接操作する関数。 たとえば、
__enableと__disable、_ReturnAddressと_AddressOfReturnAddress、またはマルチメディアの組み込み関数を使用すると、すべてネイティブ コードになります。#pragma unmanagedディレクティブに続く関数 (逆の#pragma managedもサポートされています)。配列型 (
__declspec(align(...))を使用して宣言された型) への参照を含む関数。