Domanda

Visual Studio 2010 viene installata la versione ... 4974 del runtime VC9 cui . PDB non sono disponibili . Come posso forzare il mio GME.exe di utilizzare un runtime VC9 vecchio?

Ho provato a mettere questo in 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>

Tuttavia, i rapporti sxstrace:

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

L'aggiunta di <publisherPolicy apply="no"/> sotto i risultati <dependentAssembly> in ERROR: Activation Context generation failed. senza altre informazioni utili su Windows 7.

Si noti questo è solo per il debug mia copia locale, non la redistribuzione, quindi non sono preoccupato per gli aggiornamenti di sicurezza o altri benefici della politica editore.

È stato utile?

Soluzione 2

Ecco il trucco per ottenere la configurazione di applicazione al lavoro con Win2003 e versioni successive:

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

In sostanza, bisogna aggiungere l'applicazione per il database di compatibilità con "EnableAppConfig"

Questo è documentato qui:

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

GME.exe.Config di lavoro:

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

Sembra che si deve fare questo per DLL caricati troppo.

Altri suggerimenti

La risposta arriva da http://blog.kalmbachnet.de/?postid=80

Il trucco è quello di rimuovere dal file manifesto l'attributo publicKey sul assemblyIdentity modo WinSxS non viene utilizzato.

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>

Incorporare il manifesto in GME.exe (sostituto 1 per 2 per la modifica DLL):
mt -manifest GME.exe.manifest -outputresource:GME.exe;1

Quindi copiare le DLL necessarie:
cp -a windows/winsxs/x86_microsoft.vc90.{atl,crt,mfc}*30729.4148*/*dll path-to-app/

Quindi creare manifesta per ogni gruppo che SxS non viene utilizzato per e metterli accanto all'applicazione. Manifesti sono basati su esempio 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>

Non è possibile rimuovere i riferimenti di montaggio del manifesto dell'applicazione, come lamenta il tubo catodico che non viene caricata tramite SxS.

Purtroppo sembra si deve modificare il manifesto per ogni DLL dipendente nell'applicazione, tra cui le DLL copiati da WinSxS, o più versioni possono essere caricati.

Ecco uno script bash che ha lavorato per me, dove ~ / Documenti / SxS-hack / contiene le DLL CRT e si manifesta modificati:

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

Se hai la fonte si può sempre collegare in modo statico della libreria C-runtime che si desidera utilizzare ... Non sempre la più grande idea, ma se hai ereditato una libreria mostro che verrà eseguito solo in modalità debug e non può ridistribuire il CRT di debug che farà il trucco ...

Ecco come disattivare la politica editore su Vista o 7:

accedere a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ vincitori \ x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_none_02d0010672fd8219 \ 9.0

Imposta la chiave di default per la versione che si desidera, ad esempio, 9.0.30729.4148. Impostare la versione non si vuole a 0, ad esempio, "9.0.30729.4974" = 00.

È necessario fare questo per crt, ATL, MFC, ecc.

WinSxS sembra mettere in cache la politica. Questo ha funzionato per me: touch (1) l'applicazione, quindi impostare HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SideBySide \ PublisherPolicyChangeTime a qualcosa di basso, per esempio 10.

Questo disabiliterà il runtime più recente per l'intero sistema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top