0

大規模なプロジェクトの一部である 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>

しかし今、私のライブラリはタグなしで生成されています。

最後に、最初の方法を使用できれば非常に好ましいことに注意してください。これは、より単純で、コードに直接組み込まれるものであるためです。この方法では、プロジェクト用に別のマニフェスト ファイルを維持することを覚えておく必要がありません。

4

1 に答える 1

0

しかし、それは高度に制御された環境です

問題は、そのマシンが CRT の最新のセキュリティ更新プログラムを受け取っていないことです。そのマシンがインストーラーの作成者でもある場合、説明した問題が確実に発生します。マシンで利用できない DLL バージョンを要求しています。

既知のセキュリティ上の問題があるユーザーのマシンにファイルを展開することは、間違いなく見直しが必要な一種のポリシーです。_CRT_ASSEMBLY_VERSION マクロを定義するのが正しい方法ですが、ソース ファイルではなくプロジェクト設定でそのマクロを設定することを検討してください。これにより、vc/include/crtassem.h が #include される前に確実にマクロが設定されるようになります。プロジェクト + プロパティ、C/C++、プリプロセッサ、プリプロセッサ定義の設定。

はい、確かにすべてのプロジェクトで。

于 2012-06-18T18:36:21.040 に答える