2011-11-11 40 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> 

我的問題是:

我怎樣才能限制清單列出只有一個版本,最好是9.0。 21022.8。這樣我可以在應用程序中捆綁必要的C-Run時間依賴關係?

我知道可能的根本原因這個問題是它使用9.0.21022.8和我的VC++速成2008年可能會使用一些9.0.30729.1庫相關。這就是爲什麼兩者都列爲依賴項。

注:

我下面的方法B)的http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print其中談到複製應用程序文件夾內的CRT DLL文件和Microsoft.VCXX.CRT.manifest文件。

+0

你需要解決這個問題。是的,使用相同的編譯器設置重建所有庫。 –

+0

除了漢斯的評論,值得一讀[this](http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/),它告訴你有一點關於控制你的代碼綁定到的庫的版本。 – tinman

+0

感謝@tinman,您發佈的鏈接有助於解決我的問題。 – amit

回答

9

默認爲Visual Studio 2008是綁定到9.0.21022.8版本。這是不管的服務包或已安裝修補程序的任何版本,因爲升級到Visual Studio不一定迫使你的應用程序必須升級(如描述here)。

其他可能的版本是9.0.30729.1的Service Pack 1或9.0.30729.6161與安全更新SP1。還有其他人。

因爲默認的行爲,很可能是你的應用程序正在使用9.0.21022.8並有已編譯使用9.0.30729.1庫。你可以找出什麼版本每個庫的依賴於通過使用下面的命令行(described here):

dumpbin /directives <name>.lib 

爲了你的應用程序綁定到你可以在項目設置中定義預處理器符號運行的control the version (必須在項目設置或命令行)來綁定至默認版本(9.0.21022.8 - 通過不將它們定義)或您安裝Visual Studio結合同一版本

_BIND_TO_CURRENT_VCLIBS_VERSION=1 

顯然你也可以指定e你想使用從this answer定義的xact版本來綁定(也許我應該在鍵入所有這些之前找到:)。

如果你覺得這是你的應用程序,結合9.0.30729.1和從屬庫結合9.0.21022.8,那麼你只需要取出預處理器定義。

另一個困難是,當您升級Visual Studio中,運行時合併在你的可再發行文件夾模塊也升級到這些版本。所以,如果你有一個使用這些合併模塊,並且你正在試圖綁定到你最終會在安裝運行時的新版本中的默認版本的安裝項目。

如果您還分發運行時策略合併模塊,則解析運行時版本不會成爲問題,因爲庫加載程序將在運行時查看運行時的策略並自動加載最新版本,即使您綁定到默認值版。即使使用私有程序集加載器will first look in the WinSxS folder,所以如果策略在那裏,您將綁定到最新版本。因此,您的清單中的混合版本號將重定向到最新版本。

有時這並不是你想要的,你可以控制它強制它只加載你指定的清單中的版本,這在this similar SO question的回答中有解釋。

+0

+賞金:太棒了。 –