これは .NET エラーではなく、MS C ランタイム (CRT、MSCRT) エラーです。
サードパーティの dll は、おそらくいくつかの MSCRT dll を使用しています (多くのバージョンがあります)。ネイティブ アプリケーションのプロセス起動時に、CRT が初期化されます (次に を呼び出すプログラム エントリ ポイントが含まれますmain
)。スレッドごとのデータが正しく設定されるように、新しいスレッドのエントリ ポイントもあります。
.NET 2 ランタイム1がデフォルトでネイティブ コードと同じ MSCRT を使用する場合、正しく初期化されます。.NET 4 はおそらく新しいバージョンを使用します (.NET と同様に、新しいバージョンの MSCRT には新しいバージョンの VS が付属する傾向があります)。古い MSCRT は依存関係としてのみ読み込まれ、アプリケーションの起動には使用されません。
ほとんどの場合、MSCT はこれを正しく処理しますが、サード パーティの dll が何か「賢い」ことをしている場合、初期化をバイパスしている可能性があります。.NET で同じバージョンの MSCRT が使用されている場合、これはたまたま機能します。CreateThread
このような不適切な使用例は、MSCRT_beginthread
ラッパーを使用せずに直接呼び出すことです。
この根本的な原因を突き止めるには、サード パーティの dll とラッパーを十分に理解する必要があります。おそらく、サード パーティに再作成して修正してもらう必要があります。
1 V3.5 は、2.0 CLI の上に追加された単なるアセンブリであることを思い出してください。