Delen via


.NET Framework 4 で C++/CLI 混在モード アセンブリを使用すると、スレッドの生成・終了時にメモリ リークが生じる問題について

こんにちは、Visual Studio サポート チームです。
今回は、.NET Framework 4 上で、C++/CLI の混在モード アセンブリを使用した場合に発生するメモリ リークの問題についてお知らせします。

現象

Visual C++ 2010 などを使用して開発された、.NET Framework 4 上で動作する C++/CLI の混在モード アセンブリを使用するアプリケーションで、スレッドの生成と終了を繰り返すとスレッドの生成時に確保されたメモリ領域が解放されずにリークする。

原因

本現象は .NET Framework 4 のランタイム ライブラリの不具合に起因して発生します。
スレッドの生成・終了時には、プロセスにロードされている各 DLL のエントリポイントとなる関数 (DllMain) がコールされますが、.NET Framework のランタイム ライブラリの 1 つ (mscoreei.dll) において、C++/CLI 混在モード アセンブリをロードしている場合に固有のメモリ領域をスレッド生成時に確保する動作があり、スレッドの終了時にこの領域を適切に解放していないために、メモリリークが発生します。

弊社製品の不具合によりお客様にご迷惑をおかけしておりますこと、深くお詫び申し上げます。

解決方法

本問題は .NET Framework 4.5 以降では修正されています。
このため、アプリケーションの実行環境に .NET Framework 4.5 以降のランタイムライブラリをインストールすることで、本問題を解消することが可能です。

現時点で最新の .NET Framework のバージョンは 4.5.2 であり、以下よりダウンロードして利用可能です。

Windows Vista SP2、Windows 7 SP1、Windows 8、Windows 8.1、Windows Server 2008 SP2、Windows Server 2008 R2 SP1、Windows Server 2012、および Windows Server 2012 R2 用 Microsoft .NET Framework 4.5.2 (オフライン インストーラー)
https://www.microsoft.com/ja-JP/download/details.aspx?id=42642

Windows Vista SP2、Windows 7 SP1、Windows 8、Windows 8.1、Windows Server 2008 SP2、Windows Server 2008 R2 SP1、Windows Server 2012、および Windows Server 2012 R2 用 Microsoft .NET Framework 4.5.2 (Web インストーラー)
https://www.microsoft.com/ja-JP/download/details.aspx?id=42643

補足

.NET Framework 4 をターゲットとしてビルドされたアプリケーションを .NET Framework 4.5.2 上で利用するにあたり、通常、アプリケーションをビルドしなおす必要はありません。
.NET Framework 4.x 系は後方互換性を有しており、.NET Framework 4 をターゲットとしてビルドされたアプリケーションは、ほとんどの場合、.NET Framework 4.5.2 上で問題なく動作します。.NET Framework 4.x 系の互換性に関する変更点の詳細に関しましては、以下のドキュメントをご参照ください。

.NET Framework 4.5 のアプリケーションの互換性
https://msdn.microsoft.com/ja-jp/library/hh367887.aspx

.NET Framework 4.5.1 のアプリケーションの互換性
https://msdn.microsoft.com/ja-jp/library/dn458352(v=vs.110).aspx

.NET Framework 4.5.2 のアプリケーションの互換性
https://msdn.microsoft.com/ja-jp/library/dn720543(v=vs.110).aspx