Pregunta

Visual Studio 2010 instala la versión 4974 ... del tiempo de ejecución VC9 cuya . PDBs no están disponibles . ¿Cómo puedo forzar mi GME.exe utilizar un tiempo de ejecución VC9 mayor?

He intentado poner esto en 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>

Sin embargo, los informes sxstrace:

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

Adición <publisherPolicy apply="no"/> bajo <dependentAssembly> resultados en ERROR: Activation Context generation failed. con ninguna otra información útil en Windows 7.

Tenga en cuenta que esto es sólo para depurar mi copia local, no la redistribución, así que no estoy preocupado acerca de las actualizaciones de seguridad u otros beneficios de la política editorial.

¿Fue útil?

Solución 2

Aquí está el truco para obtener la configuración de aplicaciones para trabajar con Win2003 y posteriores:

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

En esencia, hay que añadir la aplicación a la base de datos de compatibilidad con "EnableAppConfig"

Esto está documentado aquí:

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

GME.exe.Config de trabajo:

<?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>

Parece que hay que hacer esto para .dlls cargados también.

Otros consejos

La respuesta viene de http://blog.kalmbachnet.de/?postid=80

El truco consiste en eliminar del manifiesto de aplicación el atributo publicKey en el assemblyIdentity por lo WinSxS no se utiliza.

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>

Insertar el manifiesto en GME.exe (sustituto 1 para 2 para modificar DLL):
mt -manifest GME.exe.manifest -outputresource:GME.exe;1

A continuación, copie los archivos DLL necesarios:
cp -a windows/winsxs/x86_microsoft.vc90.{atl,crt,mfc}*30729.4148*/*dll path-to-app/

A continuación, crear manifiestos para cada conjunto que SxS no está siendo utilizado para y colocarlos junto a la aplicación. Los manifiestos se basan en, por ejemplo, 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>

No es posible eliminar las referencias de ensamblado de la manifiesto de aplicación, como se queja de la CRT que no se carga a través de SxS.

Por desgracia, parece uno debe modificar el manifiesto para cada DLL dependiente de la aplicación, incluyendo los archivos DLL copiados de WinSxS, o múltiples versiones pueden ser cargados.

Aquí hay un script bash que trabajó para mí, donde ~ / Documentos / SxS-Hack / contiene los archivos DLL de CRT y manifiestos modificados:

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

Si tienes la fuente siempre se puede enlazar estáticamente la biblioteca c-tiempo de ejecución que desea utilizar ... No siempre es la mejor idea, pero si usted ha heredado una biblioteca monstruo que sólo se ejecutará en modo de depuración y no puede redistribuir el CRT de depuración que va a hacer el truco ...

Así es como para desactivar la política editorial en Vista o 7:

Vaya a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ \ SideBySide ganadores \ x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_none_02d0010672fd8219 \ 9.0

Configurar la clave por defecto a la versión que desea, por ejemplo, 9.0.30729.4148. Establecer la versión no desea a 0, por ejemplo, "9.0.30729.4974" = 00.

Debe hacer esto para CRT, ATL, MFC, etc.

WinSxS parece caché de la política. Esto funcionó para mí: el tacto (1) la aplicación, entonces el conjunto de HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ PublisherPolicyChangeTime a algo bajo, por ejemplo 10.

Esto desactivará el nuevo tiempo de ejecución para todo el sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top