Windows nimmt ältere msvcp90.dll Version?
-
Ich habe da eine Verständnisfrage. Ich habe eine EXE die ich mit MSVC 2008 SP1 gebaut habe. Das SP1 enthält bekanntlich C++ TR1, wie z.B. tr1::shared_ptr, die ich auch nutze. Auf meinem PC ist natürlich die aktuelleste Runtime DLL installiert. Alles OK.
Auf einem fremden PC ist im shared SxS auch die 9.0 Runtime installiert, aber die vor dem SP1.
Zur Klarstellung: ich brauche msvcp90.dll Version 9.0.30729.1. Im Shared SxS ist aber Version 9.0.21022.8 installiert.
Also dachte ich mir: die 9.0.30729.1 DLLs packe ich mit in das lokale EXE-Verzeichnis mit rein. Denn laut MSDN Eintrag:
With this technique, it is enough to copy a folder with DLLs and manifests for dependent assemblies to the application's local folder. The operating system's loader, when executing the application, still looks for dependent assemblies in the WinSxS folder first; however when a corresponding assembly cannot be found, the loader loads a private assembly from this sub-directory.
Wenn ich das richtig verstehe: wenn im SxS nicht die korrekte Version vorhanden ist, wird die privaten Assembly geladen... das wird wohl das lokale Verzeichnis sein, in dem die EXE liegt. Oder?
Wie kommt es, das er trotzdem die ältere DLL lädt und somit ein Runtime-Error kommt? Was kann man tun, ohne Installation?
-
Wenn Du ein Manifest mit *publicKeyToken* hast, dan werden *immer* die DLLs aus dem SxS genommen, wenn dort eine passende Version ist.
Und da Du vermutlich in Deinem Programm nicht
_BIND_TO_CURRENT_MFC_VERSION 1
_BIND_TO_CURRENT_CRT_VERSION 1definiert hast, enthält Dein Manifest die Version ohne SP1! Somit wird es auch gestartet, wenn *kein* SP1 installiert ist!
Siehe:
http://blogs.msdn.com/vcblog/archive/2008/05/15/vc-runtime-binding.aspxUnd die private Assembly wird nur geladen, wenn keine passende Version im SxS gefunden wurde... aber da Du in Deinem Manifest die "falsche" (nämlich RTM) Version anforderst, findet er die natürlich.
Ich sag nur: DLL-Hölle war ein Spass gegen SxS...
-
Jochen Kalmbach schrieb:
Wenn Du ein Manifest mit *publicKeyToken* hast, dan werden *immer* die DLLs aus dem SxS genommen, wenn dort eine passende Version ist.
Deswegen rate ich grundsätzlich dazu die publicKeyToken ganz zu entfernen.
Meine Lösung macht dies automatisch:
http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/
http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/Jochen Kalmbach schrieb:
Ich sag nur: DLL-Hölle war ein Spass gegen SxS...
Wem sagst Du das!
Aber ab 2010 wechseln wir ja wieder zurück in die DLL Hölle, da ist es dann wieder etwas kühler...
-
Martin Richter schrieb:
http://blog.m-ri.de/index.php/2007/06/12/mein-erster-codeproject-artikel/
http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/
=>
Warning: require(/mnt/web4/23/96/5530796/htdocs/m-ri/blog/wp-includes/compat.php) [function.require]: failed to open stream: No such file or directory in /mnt/web4/23/96/5530796/htdocs/m-ri/blog/wp-settings.php on line 263
Hast Du da was gelöscht?