2

複数の DLL を使用し、VS2008 でコンパイルするプロジェクトをコンパイルしています。最近の Windows Update の後、コンピューターでコンパイルされた DLL が他のコンピューターで動作しなくなりました。

いくつかの調査の結果、私がコンパイルしている CRT 再頒布可能ライブラリがバージョン「9.0.21022.8」からバージョン「9.0.30729.4148」に更新されたことが判明しました。

これは、コンパイルしている EXE のマニフェスト ファイルから明らかです。次の内容が含まれます。

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

つまり、2 つの異なるバージョンの CRT を同時に使用したいということです。2 番目のバージョンは、現在コンパイルしているコードに必要であり、最初のバージョンは、数週間前にコンパイルされた古い dll に必要です。

アプリケーションが展開されているコンピューターでは、Microsoft.VC90.CRTWinSXS からではなく、ローカル フォルダーから CRT dll を取得するため、これが問題になります。このフォルダーに 2 つの異なるバージョンの dll を含めることはできません。

この問題に対する既知の解決策はありますか?それとも、新しい CRT を使用して他のすべての DLL のコンパイルを開始する必要がありますか?

4

1 に答える 1

0

これは、サイド バイ サイド アセンブリによって引き起こされる多くの問題の 1 つです。Visual Studio の更新があるたびに、すべてのコードを再コンパイルする必要があります。CRT のバージョンが変更されたため、コードの一部は 1 つの DLL を使用し、残りは別の DLL を使用しています。

また、配布するときは、DLL をアプリケーション フォルダにコピーするのではなく、マージ モジュールまたは適切なインストール セットを使用して CRT を配布する必要があります。これにより、プログラムは WinSxS を介して適切なランタイムを検索できます。

最後に、私が行ったように、問題を完全に取り除きたい場合は、すべてのプロジェクトを変更して CRT と静的にリンクし、すべてを再コンパイルすることができます。これにより、ランタイム DLL への依存が完全に削除されます (少なくとも、独自のコードでは)。ここで心配する WinSxS はもうありません。

于 2011-08-06T07:41:45.863 に答える