大規模なプロジェクトの一部である Visual Studio 2005 で構築している C++ ネイティブ ライブラリがあります。
このプロジェクトには、通常、Microft C++ 再頒布可能パッケージ ライブラリ (msvcr80.dll など) を含む他の dll がいくつか含まれています。このようにして、ユーザーに Microsoft Visual C++ Redistributable Package 2005 をインストールさせることなく、プロジェクトを展開できます。
問題は、ライブラリをこの大きなプロジェクトに入れるたびに、次のエラーが発生することです。
This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.
これを解決するために、dll が使用していた Visual Studio CRT のバージョンと、より大きなプロジェクトが使用していたバージョンの Visual Studio CRT を調べましたが、それらが異なることが判明しました。
以下は、より大きなプロジェクトのマニフェストです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>
そして、これは私が私のライブラリから得たものです:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
次に、Web でいくつかの調査を行い、dll の CRT バージョンを手動で変更する方法を少なくとも 2 つ見つけました。
1 つ目は、プロジェクトに次のマクロを設定することです。
#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"
2 つ目の詳細については、この投稿を参照してください。
私はそれらの両方を試しましたが、どちらもうまくいきませんでした。
最初のものについては、プロジェクトのヘッダー ファイルの 1 つに _CRT_ASSEMBLY_VERSION を追加しましたが、CRT バージョンは変更されませんでした。また、複数のプロジェクトがある場合、すべてのプロジェクトにこのマクロを追加する必要がありますか?
2 つ目については、ライブラリのマニフェストを次のように変更しました。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
しかし今、私のライブラリはタグなしで生成されています。
最後に、最初の方法を使用できれば非常に好ましいことに注意してください。これは、より単純で、コードに直接組み込まれるものであるためです。この方法では、プロジェクト用に別のマニフェスト ファイルを維持することを覚えておく必要がありません。