/clr
制限
/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(...))
を使用して宣言された型) への参照を含む関数。