如何强制本机应用程序使用较旧的C运行时

Visual Studio 2010安装版本为4974的VC9运行时的.pdbs不可用 。 我如何强制我的GME.exe使用较旧的VC9运行时?

我已经尝试把这个进入GME.exe.config

 <?xml version="1.0"?> <configuration> <windows> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity type="win32" name="GME" processorArchitecture="x86" version="1.0.0.1"/> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86" /> <bindingRedirect oldVersion="9.0.21022.8-9.0.21022.4974" newVersion="9.0.30729.4148" /> <bindingRedirect oldVersion="9.0.30729.0-9.0.30729.4974" newVersion="9.0.30729.4148" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86" /> <bindingRedirect oldVersion="9.0.21022.8-9.0.21022.4974" newVersion="9.0.30729.4148" /> <bindingRedirect oldVersion="9.0.30729.0-9.0.30729.4974" newVersion="9.0.30729.4148" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.ATL" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86" /> <bindingRedirect oldVersion="9.0.21022.8-9.0.21022.4974" newVersion="9.0.30729.4148" /> <bindingRedirect oldVersion="9.0.30729.0-9.0.30729.4974" newVersion="9.0.30729.4148" /> </dependentAssembly> </assemblyBinding> </windows> </configuration> 

但是,sxstrace报告:

 INFO: Resolving reference Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" .... INFO: Publisher Policy redirected assembly version. 

<dependentAssembly>下添加<publisherPolicy apply="no"/> <dependentAssembly>导致ERROR: Activation Context generation failed.Windows 7上没有其他有用的信息。

注意这只是为了debugging我的本地副本,而不是重新分发,所以我不担心安全更新或发布者策略的其他好处。

Solutions Collecting From Web of "如何强制本机应用程序使用较旧的C运行时"

答案来自http://blog.kalmbachnet.de/?postid=80

诀窍是从应用程序清单中删除publicKey上的publicKey属性,所以不使用WinSxS。

GME.exe.manifest

 <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"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86"> </assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86"> </assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.ATL" version="9.0.30729.4148" processorArchitecture="x86"> </assemblyIdentity> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"> </assemblyIdentity> </dependentAssembly> </dependency> </assembly> 

将清单嵌入到GME.exe (用1代替2来修改dll):
mt -manifest GME.exe.manifest -outputresource:GME.exe;1

然后复制必要的dll:
cp -a windows/winsxs/x86_microsoft.vc90.{atl,crt,mfc}*30729.4148*/*dll path-to-app/

然后为每个SxS未被使用的程序集创建清单,并将它们放在应用程序旁边。 清单是基于例如C:\Windows\WinSxS\Manifests\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2.manifest
Microsoft.VC90.CRT.Manifest

 <?xml version="1.0"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86"></assemblyIdentity> <file name="msvcr90.dll"></file> <file name="msvcp90.dll"></file> <file name="msvcm90.dll"></file> </assembly> 

不能从应用程序清单中删除程序集引用,因为CRT抱怨它没有通过SxS加载。

不幸的是,似乎必须修改应用程序中每个依赖dll的清单,包括从WinSxS复制的dll,或者可以加载多个版本。

这里有一个bash脚本,适用于我,其中〜/ Documents / sxs-hack /包含CRT dll和修改后的清单:

 rm -rf bin mkdir bin cp -a ~/Documents/sxs-hack/* bin/ find -iname \*.dll -or -iname \*.ocx -or -iname \*.exe | while read -r file; do cp -a "$file" bin/"$(basename $file)" export file=bin/"$(basename $file)" export res=$file\;2 if [ ${file:${#file}-3} = "exe" ]; then export res=$file\;1; fi echo $file mt.exe -nologo -inputresource:"$res" -out:extracted.manifest && perl -pli -e 's/(Microsoft.VC90.[^>]*)version="[^"]*"([^>]*)publicKeyToken="[^"]*"/$1 $2 version="9.0.30729.4148"/g;' extracted.manifest && mt -nologo -manifest extracted.manifest -outputresource:"$res" regsvr32 /s "$file" || true done 

以下是使应用程序配置与Win2003及更高版本一起使用的技巧:

http://www.tech-archive.net/Archive/VC/microsoft.public.vc.ide_general/2008-01/msg00033.html

本质上,需要使用“EnableAppConfig”将应用程序添加到兼容性数据库

这是在这里记录:

http://msdn.microsoft.com/en-us/library/ee710783%28VS.85%29.aspx

工作GME.exe.Config

 <?xml version="1.0"?> <configuration> <windows> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> <publisherPolicy apply="no"/> <bindingRedirect oldVersion="9.0.21022.0-9.0.21022.4974" newVersion="9.0.30729.1" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/> <publisherPolicy apply="no"/> <bindingRedirect oldVersion="9.0.21022.0-9.0.21022.4974" newVersion="9.0.30729.1" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.ATL" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/> <publisherPolicy apply="no"/> <bindingRedirect oldVersion="9.0.21022.0-9.0.21022.4974" newVersion="9.0.30729.1" /> </dependentAssembly> </assemblyBinding> </windows> </configuration> 

似乎有人需要为加载的.dll做这个。

如果你有源代码,你总是可以静态链接你想使用的c-runtime库…并不总是最好的想法,但是如果你继承了一个只能在调试模式下运行的怪物库,并且不能重新分配调试CRT它会做的伎俩…

以下是如何禁用Vista或7上的发布者策略:

导航到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ Winners \ x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_none_02d0010672fd8219 \ 9.0

将默认密钥设置为所需的版本,例如9.0.30729.4148。 设置你不想要的版本0,例如“9.0.30729.4974”= 00。

你必须为crt,atl,mfc等做这个

WinSxS似乎缓存策略。 这对我工作︰touch(1)该应用程序,然后将HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ SideBySide \ PublisherPolicyChangeTime设置为低,例如10。

这将禁用整个系统的较新的运行时。