web-dev-qa-db-ja.com

VCRedist_x86.exeを使用しないVisualC ++再頒布可能パッケージ

私は厳しい制約のある環境で開発していますが、開発者も厳しく管理しています。

VCRedist_x86.exe-4Mbの再配布可能ファイルは面白くありません(転送に4時間かかります)。 MFC90.dll、msvcm90.dll、msvcp90.dll、msvcr90.dllを再配布したいのですが、これは2Mbに似ています。ただし、 Visual C++ファイルの再配布 は次のように述べています。

マニフェストなしでビルドされたC/C++アプリケーションの再配布はサポートされていません。 Visual C++ライブラリは、アプリケーションをこれらのライブラリにバインドするマニフェストがないと、C/C++アプリケーションで使用できません。詳細については、 展開方法の選択 を参照してください。

DLLをプログラムの作業ディレクトリにコピーするという私の当初の計画は、このすばらしい新世界のマニフェストでは機能しないようです。

私の次の推測は、ファイルをWinSxSディレクトリに移入するために必要なレジストリエントリをまとめて、(4メガプログラムを使用するのではなく)自分で移入することです。

[編集]ソフトウェアは頻繁に更新されるため、静的リンクよりもDLLを強くお勧めします。 [/編集]

必要なファイルを正常に配布し、オーバーヘッドを抑えるにはどうすればよいですか?

15
Josh

これを使用します: ハウツー:vcredist_x86.exeをインストールせずにVC2008アプリをデプロイする

本質的に

  • Exeファイルにマニフェストを埋め込まないでください。
  • C++ DLLとそのマニフェストをアプリのディレクトリにコピーします。
  • すべてのマニフェスト(自分とMicrosoft)から「publicKeyToken」を削除します。
  • 必要に応じて、アプリのマニフェストファイルのバージョン情報をMicrosoftマニフェストファイルと一致するように変更します(またはその逆)。
13
Joe

[私はマイクロソフトの現在のSxSメンテナーです]

マニフェストからpublicKeyToken属性を削除することを強くお勧めしますに対して。 dllのプライベート展開は、この属性をそのままにしておくと問題なく機能します。ただし、これを削除すると、依存関係が一致しなくなるため、ターゲットマシンの中央に新しいバージョンのCRTがインストールされている場合に、アプリがセキュリティ更新プログラムの恩恵を受けることができなくなります。

つまり、要約すると、マニフェストをデフォルトで埋め込んでも安全です。 CRTマニフェスト+ DLLファイルを、編集せずに実行可能ファイルのディレクトリに直接コピーします。それだけです。互換性のあるWin2k +。

27

コンパイラのプロパティページの「ランタイムライブラリ」設定に/ MT(マルチスレッド)を指定します。これはランタイムライブラリに対して静的にリンクするため、再配布可能ファイルをインストールする必要はありません。

4

それらをプライベートアセンブリとしてインストールします。ここを参照してください:

http://msdn.Microsoft.com/en-us/library/ms235291.aspx

提供されているすべてのDLLが必要ない場合は、必要なものだけを参照するようにマニフェストファイルを変更できることに注意してください。

1
Gerald