/clr 制限

使用に関する次の制限事項に /clr注意してください。

  • 構造化例外ハンドラーでは、/clr でコンパイルする際の _alloca の使用に関する制限事項があります。 詳細については、_allocaを参照してください。

  • /clr では実行時エラー チェックは使用できません。 詳細については、「方法: ネイティブ ランタイム チェックを使用する」をご覧ください。

  • 標準の C++ 構文のみを使用するプログラムをコンパイルする場合 /clr は、インライン アセンブリの使用に次のガイドラインが適用されます。

    • ネイティブ スタック レイアウト、現在の関数の外部の呼び出し規則、またはコンピューターに関するその他の低レベルの情報に関する知識を想定しているインライン アセンブリ コードは、その知識がマネージド関数のスタック フレームに適用される場合、エラーになる可能性があります。 インライン アセンブリ コードを含む関数は、アンマネージ関数として生成されます。この関数は、アンマネージ関数を使用せずに /clrコンパイルされた別のモジュールに配置されたかのように生成されます。

    • コピーで構築された関数のパラメーターを渡す関数内のインライン アセンブリ コードはサポートされていません。

  • /clr でコンパイルされたプログラムから vprintf 系関数を呼び出すことはできません。

  • /clr では naked__declspec 修飾子は無視されます。

  • translator 関数セット _set_se_translator は、アンマネージ コードの catch にのみ影響します。 詳細については、例外処理に関するページを参照してください。

  • /clr では、関数ポインターの比較は許可されません。

  • /clr では、完全なプロトタイプ関数以外の関数は使用できません。

  • /clr では、次のコンパイラ オプションはサポートされていません。

  • _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

  • アプリケーションは 1 つの appdoメイン プロセスでのみコンパイル/openmp/clrされ、実行できます。 詳細については、/openmp (OpenMP 2.0 サポートの有効化) に関するページを参照してください。

  • 可変個引数 (vararg) を受け取る関数は、ネイティブ関数として生成されます。 可変個引数の位置にあるすべてのマネージド データ型は、ネイティブ型にマーシャリングされます。 System.String 型は、いずれも実際にはワイド文字の文字列ですが、1 バイト文字の文字列にマーシャリングされます。 したがって、printf 指定子が %S (wchar_t*) である場合、代わりに %s 文字列にマーシャリングされます。

  • va_arg マクロを使用する場合、/clr:pure でコンパイルすると予期しない結果が生じる可能性があります。 詳細については、「va_argva_copyva_endva_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(...)) を使用して宣言された型) への参照を含む関数。

関連項目