3

I'm using Visual Studio 2008 for C++. When compiling, Visual Studio compiles against the header files of the VC 9.0 libraries. However, there are different versions of this library available:

  • v9.0.21022.8 (= RTM)
  • v9.0.30729.17 (= SP1)
  • v9.0.30729.4148 (= SP1 with security update)

I'd like to know whether it is possible to tell Visual Studio which version it should compile against.

これが重要だと私が考える理由は、アプリケーションのインストーラーが Microsoft Visual C++ 2008 Redistributable Package の正しいバージョンがインストールされていることを確認する必要があるためです。どうやら一部の Windows Update ( Visual Studio の更新ではない) でこの依存関係が変更される可能性があるため、この依存関係を制御できないように感じます。インストーラーが再頒布可能パッケージをアップグレードする際のオーバーヘッドを避けるために、同じバージョンを使い続けたいと思います。

この状況は私の以前の質問とは異なることに注意してください。それはリンク時間に関するものでした。hereで説明されているように、埋め込みマニフェスト ファイルに含まれるバージョンを制御する方法も探していません。

4

4 に答える 4

2

バイナリに含まれているマニフェストは、VSビルドシステムによって自動的に生成されます。マニフェストに出力されるバージョンの依存関係を決定する重要なヘッダーは、vc \ include\crtassem.hとcrtdefs.hです。前者はCRTバージョンを宣言します。_BIND_TO_CURRENT_CRT_VERSIONマクロを使用した「最新」バージョンと比較してRTMバージョンがすでにサポートされていることに注意してください。後者には、/manifestdependencyリンカーオプションを.objファイルに埋め込むための#pragmaコメントディレクティブが含まれています。これにより、リンカーはマニフェストを自動生成します。

この方法で行う必要はありません。マニフェストを生成するリンカーオプションをオフにして、独自のオプションを作成するだけです。これにより、アプリがバインドするCRTバージョンを完全に制御できます。あなたがこれを先取りしているかどうかは少し疑わしいです。昨年7月に更新された古いバージョンのCRTはまだ出荷されている可能性があり、重大なセキュリティバグが含まれていました。顧客は、セキュリティ上の欠陥を十分に文書化して解決したソフトウェアを自分のマシンにインストールすることに少し不満を感じる傾向があります。


次に行う必要があるのは、DLLの展開を制御することです。DLLをWinSxSサイドバイサイドキャッシュに自分でデプロイする必要があります。

方法を理解すれば、それは機能しますが、それほど長くは存続しない可能性があります。Windows Updateが有効になっている場合、マシンがパッチが適用されていないバージョンのDLLを使用していることを検出し、それを更新する場合があります。そして、パブリッシャーポリシーをデプロイして、ロード要求をリダイレクトします。マニフェストされたバージョン要求が別のバージョンのロードをもたらす場合は、マシンにそのようなポリシーファイルが設定されている可能性があります。やや避けられない結論は、これはMSFTのDLLであり、必要と思われる処理を実行するというものです。これを回避するには、applocalデプロイメントを確認してください。

于 2010-02-23T16:21:11.770 に答える
1

問題がSP1のようなものである場合、できることはあまりありません。Microsoftは、ランタイムを事実上、オペレーティングシステムのコンポーネントと見なしています。したがって、他のOSコンポーネントと同じように更新とパッチを取得します。

通常、これに問題はないはずです。パッチはバグ修正とセキュリティアップデートです。原則として、変更するたびにアプリがより安定するはずです。常に真実であるとは限りませんが、いずれにせよ、それについてできることはあまりありません。

ランタイムを変更するオプションがありますが、それらはスレッドセーフおよび同様の問題に関連しています。プロジェクトのプロパティには、関連する場所がいくつかあります。特に、[C / C ++ /コード生成]タブでは、使用するランタイムライブラリを選択できます。

深刻な心配がある場合は、静的にリンクされた非DLLランタイムを選択できます。ユーザーは引き続きランタイムDLLを更新できますが、更新してもアプリの安定性は向上しません。

于 2010-02-23T15:48:45.840 に答える
1

これは、構成がどのディレクトリに対してビルドするように設定されているかという問題です。マシンにヘッダーのすべてのバージョンと、それらがリンクするライブラリがある限り、これが各バージョンの新しい構成にならない理由がわかりません。

于 2010-02-23T15:46:36.310 に答える
0

これは、XML で記述されたマニフェスト リソース ファイルを使用して行うことができます。

以前の職場でこれを行う必要がありましたが、残念ながら (または、おそらくもっと幸いなことに)、私はそれがどのように行われたかの詳細に触れていませんでした. この記事は、この件に関して私が見つけた中で、私たちが行ったことに最も近いように見えます。

Update0

マニフェスト ファイルの生成、およびアプリケーションの分離とサイド バイ サイド アセンブリの構築におけるマニフェスト ファイルの使用に関する MSDN ドキュメントを次に示します。

于 2010-02-23T16:02:00.270 に答える