2

サード パーティから提供された DLL と、それをラップする付属の .NET 2.0 アセンブリがあります。VS2008 で .NET 3.5 プロジェクトを作成すると、ラッパー アセンブリを介して DLL を呼び出すことができ、問題なく動作します。ただし、VS2010 で同等の .NET 4.0 プロジェクトを作成するとR6030 - CRT not initialized、DLL のロード時にメッセージ ボックスにエラーが表示されます。

これを .NET 4.0 プロジェクトで動作させるためにできることはありますか? それは CAS の変更に関連しているのか、それとも何か他のものに関連しているのでしょうか?

私は今のところVS2008で作業を続けていますが、何が起こっているのかを理解するのは良いことです...

4

2 に答える 2

4

これは .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 の上に追加された単なるアセンブリであることを思い出してください。

于 2010-10-20T09:13:04.187 に答える
1

デバッグ時にのみ発生しますか、それとも実行時にも発生しますか?

2つのことが頭に浮かびます。

1).NETのデフォルトのアプリケーションタイプは、最も煩わしい.NETクライアントフレームワークを対象としているため、常に変更する必要があります。表面上は何の関係もないクライアントとして保持すると、あらゆる種類の奇妙なエラーが発生する可能性があります。それを変えてみてください。

2)VS2010または.NET4.0が必要ですか?VS 2010のみの場合は、ターゲットフレームワークを3.5に設定して、問題がVS2010または.NET4.0のどちらであるかを確認できます。

インターネット上のエラーを見ると、これはタイミングの問題であり、Cランタイムがロードされていないように見えます。これは.NET4.0で変更されたように見える動作です。どうやって直せばいいのかわからない。

于 2010-10-20T08:34:25.920 に答える