web-dev-qa-db-ja.com

アプリケーションでmsvcrt.dllを再配布する必要がありますか?

アプリケーションのライブラリの一部がmsvcrt.dllに動的に依存している場合は、アプリケーションでmsvcrt.dllを再配布し、プライベートdllを使用する必要がありますか?つまりシステムのmsvcrt.dll(dll hell)で互換性の問題が発生する可能性はありますか?アプリケーションは、WindowsServerシステムを対象としています。

30
kr

msvcrt-Microsoft Visual C++ランタイム用のダイナミックライブラリです。

WindowsでCランタイムを使用するには、次の2つのオプションがあります。

  1. 静的ランタイムライブラリとのリンク。
    cl.exeに対して/MTまたは/MTdオプションのいずれかを使用します。この場合、msvcrt DLLに依存しないため、再配布する必要はありません。 Visual Studioで、プロジェクトまたはソリューションを右クリックし、[プロパティ]> [C/C++]-> [コード生成]-> [ランタイムライブラリの使用]マルチスレッドおよびマルチスレッドデバッグそれぞれ。これは簡単な方法です。欠点は、結果の実行可能ファイルが大きくなることです。

  2. 動的Cランタイムライブラリとリンクします。
    cl.exeには/MDまたは/MDdオプションのいずれかを使用します。
    Visual Studioで、プロジェクトまたはソリューションを右クリックし、[プロパティ]> [C/C++]-> [コード生成]-> [ランタイムライブラリの使用]マルチスレッド動的リンクおよびそれぞれマルチスレッドダイナミックリンクデバッグ。これによりEXEが小さくなりますが、欠点は、アプリケーションのインストール時に必要なMSVCRTをインストールする必要があることです。


VC++コンパイラの各リリースには、Cランタイム(CRT)のバージョンが付属しています。 Visual Studio 2005には、コンパイラのv8とCRTのv8が付属しています。 v8の実際のDLLはmsvcrt80.dllでした。VS2008の場合はv9であり、ダイナミックCRTはmsvcrt90.dllでした。ただし、CRTは、C /よりも頻繁に更新およびパッチが適用されます。 C++コンパイラ。開発者は更新されたCRTをダウンロードし、それに対してビルドできます。

動的CRTライブラリを使用してコンパイルする場合は、必要なバージョンのランタイム用に再配布可能なパッケージをダウンロードする必要があります[〜#〜] must [〜#〜] Microsoft.comから、アプリのインストール中に(サイレント)インストールを実行します。


VS2005より前は、開発者はWindowsオペレーティングシステムにあったMSVCRTに依存するアプリを作成していました。これにより、アプリケーションのインストールでCRT DLLを出荷する必要がなくなり、DLL(小さいイメージサイズ))のメリットが得られます。Windoes2000より前のバージョン、開発者は\ Windowsインストールフォルダーに新しいMSVCRT.dllをインストールすることもありますが、多くのアプリやOS間でCRTを共有することも、非常に悪い考えでした。WinXPSP2では、Windowsに含まれるCRTが大幅に変更されました。 、およびそのバージョンのCRTに依存するアプリはすべて破損するリスクがありました。

この時点で、Microsoftは、Windowsに含まれているMSVCRT.dllがOSの一部であり、いつでもサービスまたはパッチを適用できることを開発者に通知します。それに対してアプリをビルドすることはサポートされていません。したがって、アプリケーションは上記の方法のいずれかを使用する必要があります。

参照:

31
justadreamer

あなた必須アプリケーションと一緒にmsvcrtを出荷します。これは、オペレーティングシステムの保証された部分ではありません。 Windowsの特定のバージョンで発生した場合、それはWindowsの何かがそれを使用しているからです。

新しいバージョンのWindowsが happen に、Windowsに付属していると思われるバイナリが含まれていなかったため、アプリケーションが壊れました。ユーザーがWinFaxをインストールしないことを選択したときにアプリケーションが壊れました。つまり、msvcrtがインストールされていませんでした。

から レイモンドチェン

実行しているWindowsのバージョンに応じて、正式な製品コンポーネントではないものの、さまざまなサポートDLLが存在する可能性があります。

.。

この問題は今日も続いています。人々は、Windowsに付属しているバイナリを探し回って、できることを探します remora 。そして、それらのバイナリが変更されたり、完全に消えたりすると、彼らは驚いています。

From KB326922 --Visual C++での共有Cランタイムコンポーネントの再配布

... CRT DLLはシステムファイルとは見なされなくなったため、CRT DLLをそれに依存するアプリケーションと一緒に配布します。システムコンポーネントが長い場合は、他のアプリケーション固有のコードとともにアプリケーションのProgram Filesディレクトリにインストールします。これにより、アプリケーションがシステムパスにインストールされている可能性のある他のバージョンのCRTライブラリを使用できなくなります。

あなた必須アプリケーションと一緒にmsvcrtを出荷します。 MSVCRT にリンクする場合。

もっと

オペレーティングシステムコンポーネントによってのみ使用されるオペレーティングシステムDLLをあきらめて、宣言することが決定されました。

MSVCRT.DLLは長い間オペレーティングシステムでしたDLL、 そしてアプリケーションへの立ち入り禁止として文書化されています 、まだあります たくさんのpeople who Cランタイム配信チャネルとして扱います そしてこれらのプログラムは製品チームに多くの悲しみをもたらします。

WindowsにはMicrosoftVisual Cランタイムが付属していないため、必須アプリケーションでMicrosoftVisualCランタイムを再配布します。 happen がDLLと呼ばれるmsvcrt.dll(保証されていません)、 the MSVCRTではありません。

24
Ian Boyd

クリスの答えは両方とも正しいので、却下されるべきではありません。

問題は、MSVCRTの2つの異なるセットがあるということです。 1つのセットは、Visual Studioに付属のmsvcrt80.dll、msvcrt90.dllなどです。これは人々が通常使用するものです。そして、他の回答で話されているように、それらは再配布されなければなりません。

もう1つは、System32フォルダー内のmsvcrt.dll(ファイル名に番号が含まれていない)です。これは、しばらく前からOS自体によってのみ使用されることを目的としています。また、アプリケーションで置き換え/再インストールしないでください。ただし、インストールする余分な依存関係を削除したいなどの理由で、一部のアプリケーションはそれにリンクしています。ただし、将来のWindowsバージョンで使用できるとは限らないことに注意してください。

12
Dudu

msvcrt.dllは、OSディストリビューションの事実上の一部になっています。 Windows 98と95、そしておそらくNT4では、ワードパッドのようなアプリをインストールから取り除くことに気を配れば、OSをインストールせずにインストールすることができました。

ただし、その普遍性と、これらのOS以降、出荷するのに苦労したアプリ開発者はほとんどいないという事実を考えると、少なくともWindows2000以降はOSの公式部分でした。

Microsoftサポートには tool があり、DLLに付属している製品を再確認するために使用できます。

this のような検索を実行すると、msvcrt.dll vsrsion7.0.3790.0がWindowsServer2003リリースの一部であることがわかります。

5
Chris Becke