2011-11-11 11 views
5

Visual C++ 2008 ExpressでVC++ 6ワークスペースを変換した後にアプリケーションを構築しています。自身が正常に行くにビルドしますが、私は持っている本当の問題は、このようになります生成されたマニフェストである:Cランタイム(CRT)ライブラリを配布する方法

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

私の質問は次のとおりです。

は、どのように私は1つのバージョンのみ、好ましくは9.0を一覧表示するマニフェストを制限することができます。 21022.8。アプリケーションに必要なCランタイム依存性をバンドルすることができますか?

この問題の根本的な原因は、9.0.21022.8を使用するライブラリとVC++ Express 2008が9.0.30729.1を使用している可能性があることです。そのため、両方が依存関係としてリストされています。

注:

私はアプリケーションフォルダ内のCRT DLLファイルとMicrosoft.VCXX.CRT.manifestファイルをコピーすることについて語っhttp://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Printのアプローチb)は次のようです。

+0

あなたはそれを修正する必要があります。はい、同じコンパイラ設定ですべてのライブラリを再構築します。 –

+0

ハンスのコメントに加えて、[this](http://www.nuonsoft.com/blog/2008/10/29/binding-to-themost-recent-visual-studio-libraries/)を読む価値があるあなたのコードがバインドされているライブラリのバージョンを制御する方法について少しお伝えします。 – tinman

+0

ありがとう@tinman、あなたが私の問題を解決するのを手伝ってくれたリンク。 – amit

答えて

9

Visual Studio 2008のデフォルトは、バージョン9.0.21022.8にバインドすることです。これは、Visual Studioの更新で必ずアプリケーションをアップグレードする必要があるわけではないので(here)、インストールしたサービスパックまたは修正プログラムのバージョンに関係なくです。

他の可能なバージョンは、Service Pack 1の場合は9.0.30729.1、セキュリティ更新プログラムのある場合は9.0.30729.6161です。他にもあります。

デフォルトの動作のため、アプリケーションで9.0.21022.8が使用されており、9.0.30729.1を使用するようにコンパイルされたライブラリが存在する可能性があります。あなたは、次のコマンドライン(described here)を使用してに依存している各ライブラリのバージョンを確認することができます

dumpbin /directives <name>.lib 

ためには、あなたのアプリケーションは、あなたに結合するランタイムのcontrol the versionにプロジェクトの設定でプリプロセッサシンボルを定義することができます

_BIND_TO_CURRENT_VCLIBS_VERSION=1 
: - (それらを定義していないことで9.0.21022.8)またはインストールされたVisual Studioのよう 同じバージョンに結合するデフォルトのバージョンにバインドするか(プロジェクト設定またはコマンドライン上にある必要があります)

どうやらあなたはeを指定することもできますthis answerの定義を使用してバインドしたいxactバージョンです(これをすべて入力する前に最初に見つけたはずです)。

9.0.30729.1にバインドするアプリケーションがあり、依存ライブラリが9.0.21022.8にバインドされていることがわかった場合は、プリプロセッサ定義を削除するだけで済みます。

もう1つの難点は、Visual Studioをアップグレードすると、再配布可能フォルダ内のランタイムマージモジュールもそれらのバージョンにアップグレードされることです。したがって、これらのマージモジュールを使用するセットアッププロジェクトがあり、既定のバージョンにバインドしようとすると、ランタイムの新しいバージョンのインストールが終了します。

ランタイムポリシーマージモジュールも配布すると、ライブラリローダーはランタイムのポリシーを参照し、デフォルトにバインドしても自動的に最新バージョンをロードするため、ランタイムバージョンの解決は問題にはなりませんバージョン。プライベートアセンブリの場合でも、ローダーwill first look in the WinSxS folderです。ポリシーがある場合は、最新のバージョンにバインドします。したがって、マニフェストの混合バージョン番号は両方とも最新バージョンにリダイレクトされます。

時にはそれが望ましくなく、指定したマニフェストのバージョンのみを強制的にロードするように制御することもできます(this similar SO questionへの回答に説明があります)。

+0

+バウンティ:素晴らしい。 –

関連する問題