Question

Visual Studio 2010 installe la version ... 4974 du temps d'exécution VC9 dont . PDB ne sont pas disponibles . Comment puis-je forcer mon GME.exe à utiliser un moteur d'exécution VC9 plus?

Je l'ai essayé de mettre cela 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>

Cependant, les rapports de sxstrace:

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

Ajout <publisherPolicy apply="no"/> sous les résultats de <dependentAssembly> à ERROR: Activation Context generation failed. sans d'autres informations utiles sur Windows 7.

Notez ceci est seulement pour le débogage ma copie locale, pas la redistribution, donc je ne suis pas inquiet au sujet des mises à jour de sécurité ou d'autres avantages de la politique de l'éditeur.

Était-ce utile?

La solution 2

Voici l'astuce pour obtenir la configuration Application au travail avec Win2003 et plus tard:

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

Pour l'essentiel, il faut ajouter l'application à la base de données de compatibilité avec « EnableAppConfig »

Ceci est documenté ici:

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

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

Il semble qu'on doit faire cela pour .DLLs aussi chargés.

Autres conseils

La réponse vient de http://blog.kalmbachnet.de/?postid=80

L'astuce consiste à retirer de l'application manifeste l'attribut publicKey sur la assemblyIdentity si WinSxS n'est pas utilisé.

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>

Intégrer le manifeste dans GME.exe (substitut 1 pour 2 pour modifier dll):
mt -manifest GME.exe.manifest -outputresource:GME.exe;1

Ensuite, copiez les fichiers DLL nécessaires:
cp -a windows/winsxs/x86_microsoft.vc90.{atl,crt,mfc}*30729.4148*/*dll path-to-app/

Ensuite, créez pour chaque ensemble manifeste que SxS n'est pas utilisé et placez-les à côté de l'application. Les manifestes sont basés sur, par exemple 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>

Il est impossible de supprimer les références de montage du manifeste d'application, que le CRT se plaint qu'il ne soit pas en cours de chargement par SxS.

Malheureusement, il semble, il faut modifier le manifeste pour chaque dll dépend de l'application, y compris les dll copiés à partir WinSxS ou plusieurs versions peuvent être chargées.

Voici un script bash qui a fonctionné pour moi, où ~ / Documents / SxS-Hack / contient les dll CRT et modifiés manifeste:

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 vous avez la source que vous pouvez toujours lier statiquement la bibliothèque c-exécution que vous souhaitez utiliser ... Pas toujours la plus grande idée, mais si vous avez hérité d'une bibliothèque de monstre qui ne fonctionnera en mode débogage et ne peut pas redistribuer le CRT de débogage, il va faire l'affaire ...

Voici comment désactiver la stratégie d'éditeur sur Vista ou 7:

Accédez à HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ Winners \ x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_none_02d0010672fd8219 \ 9.0

Définir la clé par défaut à la version que vous voulez, par exemple 9.0.30729.4148. Définissez la version que vous ne voulez pas 0, par exemple "9.0.30729.4974" = 00.

Vous devez le faire pour crt, atl, cpc, etc.

WinSxS semble mettre en cache la politique. Cela a fonctionné pour moi: contact (1) l'application, puis ensemble HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ PublisherPolicyChangeTime à quelque chose de faible, par exemple 10.

désactive le moteur d'exécution plus récent pour le système entier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top