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

+赏金:太棒了。 –