次の方法で共有


方法 : _vcclrit.h に対する依存関係を削除する

更新 : 2007 年 11 月

Visual C++ .NET および Visual C++ 2003 では、/clr コンパイラ オプションでコンパイルされた DLL は、読み込み時に非確定的にデッドロックを生じる可能性があります。この問題は、ローダーのロック問題と呼ばれます。詳細については、「混在アセンブリの初期化」を参照してください。

この問題を解決するために、Visual C++ 2003 には _vcclrit.h が用意されており、ローダー ロックを回避して DLL を初期化できました。Visual C++ 2005 では、デッドロックの発生回数を大幅に減少させるために、これまでとまったく異なる方法で初期化が処理されます。このため、このヘッダー ファイルは必要なくなりました。

ただし後方互換性のため、これまでどおり _vcclrit.h が組み込まれているので、_vcclrit.h を使用するコードは引き続き動作します。ただし、_vcclrit.h のコンテンツは既に廃止されました。このトピックでは、このヘッダー ファイルに対する依存関係を削除するために必要な、推奨される変更について説明します。

ms173267.alert_note(ja-jp,VS.90).gifメモ :

理想的なソリューションではありませんが、_vcclrit.h を含める前に _CRT_VCCLRIT_NO_DEPRECATE を定義することで、_vcclrit.h を使用した場合に示される廃止警告を表示しないようにできます。

リンカ設定に関する変更点

Visual C++ 2003 でローダー ロックを回避する推奨ソリューションを採用したプロジェクトから、_vcclrit.h を削除するために必要な変更点を次に示します。これらは、すべてリンカ設定に関する変更です。Visual Studio を使用してこれらの設定を変更する方法については、「プロジェクト設定の変更」を参照してください。

  • /NOENTRY リンカ スイッチを削除します。_vcclrit.h を使用するには、リンカに /NOENTRY (エントリ ポイントなし) スイッチを指定する必要がありました。現在のバージョンでは、その必要はありません。

  • リンカに MSVCRT.LIB を明示的に入力しないでください。/NOENTRY スイッチが必要であったため、CRT ライブラリ ファイル MSVCR.LIB に明示的にリンクする必要がありました。/NOENTRY を削除すると、/clr コンパイルによって既定でこのライブラリがリンクされます。

  • リンカ入力から NOCHKCLR.OBJ を削除します。このファイルは必要なくなりました。

  • シンボルの明示的な参照を削除します。これまでは、__DllMainCRTStartup@12、__crt_dll_initialize、および __crt_dll_terminate の各シンボルを、/INCLUDE スイッチを使用して強制的に使用する必要がありました。Visual C++ 2005 では、これらのシンボルは不要になりました。したがって、シンボルは安全に削除できます。

コードに関する変更点

コードの性質によっては、コードから #include <_vcclrit.h> を削除する以外にも変更が必要な場合があります。少なくとも __crt_dll_initialize と __crt_dll_terminate は呼び出されることがなくなるため、削除できます。

参照

概念

混在 (ネイティブおよびマネージ) アセンブリ