Frage Wie wählt man die Version der VC 2008 DLLs aus, mit der die Anwendung verknüpft werden soll?


Ich verwende Visual Studio 2008 SP1 für C ++. Beim Kompilieren muss Visual Studio auswählen, für welche Version der CRT- und MFC-DLLs die Anwendung verknüpft werden soll, Version 9.0.21022.8 (= RTM), 9.0.30729.17 (= SP1) oder 9.0.30729.4148 (= SP1 mit Sicherheitsupdate) . Ich würde gerne wissen, wie Sie wählen können, gegen welche der beiden Versionen es gelinkt wird. Weiß jemand?

Hinweis: Dies ist wichtig bei der Verwendung eines private Versammlung, weil Sie wissen müssen, welche Versionen der VC 9.0-DLLs zusammen mit der EXE-Datei kopiert werden sollen.

Hinweis Das Flag _BIND_TO_CURRENT_VCLIBS_VERSION stellt nur sicher, dass die richtige Version im Manifest enthalten ist. Die DLL-Versionsauswahl zur Laufzeit wird anscheinend nicht basierend auf der Version ausgeführt, die in der Manifestdatei enthalten ist. Auch wenn die Manifestdatei angibt, dass v21022 verwendet werden soll, verwendet die EXE die v30729 .DLLs. Ich weiß das, weil es std :: tr1 :: weakptr verwendet, das in v21022 nicht vorhanden ist.


5
2018-02-18 15:10


Ursprung


Antworten:


_BIND_TO_CURRENT_VCLIBS_VERSION setzt die aktuelle Version im Manifest - oder die RTM-Version, wenn nicht. Und es im Manifest zu setzen, ist der richtige Weg, dies zu tun.

Was Sie sehen, ist jedoch die Auswirkungen einer Assembly-Policy-Datei: - Wenn das VCRedist-Paket mit der 2008 SP1-Laufzeit installiert ist, installiert es eine Policy-Datei in den WinSxS-Speicher mit einem BindingRedirect-Eintrag, der Versuche umleitet, die RTM-Runtime zu laden SP1-Laufzeit

Daher laden Anwendungen, die die RTM-Laufzeit in ihrem Manifest angeben, die SP1-Laufzeit und Anwendungen, die die SP1-Laufzeit angeben, die SP1-Laufzeit.

Wenn Sie die RTM-Laufzeit tatsächlich verwenden möchten, selbst wenn die SP1-Laufzeit- und Richtliniendateien installiert sind, müssen Sie die RTM-Version in Ihrem Manifest angeben UND eine Anwendungskonfigurationsdatei verwenden. Grundsätzlich "yourappname.exe.config" (oder "yourdllname.dll.2.config", wenn es eine Isolation bewusst Dll verursacht Trauer). Anwendungskonfigurationsdateien können ein bindingRedirect-Element bereitstellen, das jede im Manifest angegebene Assemblyversion oder Richtliniendateien überschreibt.

Diese Konfigurationsdatei weist das Betriebssystem an, die RTM-Laufzeit zu laden, auch wenn die SP1-Laufzeit installiert ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <windows>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
                <bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/>
            </dependentAssembly>
        </assemblyBinding>
    </windows>
</configuration>

Hinweis: oldVersion darf ein Bereich sein: oldVersion="9.0.30729.1-9.1.0.0"

Sehen: Anwendungskonfigurationsdateien dokumentiert auf MSDN.


9
2018-02-18 15:28



Durch Definieren

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"

oder

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1"

Sie können eine Verknüpfung mit einer bestimmten Version herstellen.


3
2018-02-18 15:16



Der Compiler verwendet die .h- und .lib-Dateien, um zu bestimmen, welcher CRT-Code verwendet werden soll. Ändern Sie die Buildeinstellungen für das Include- und das Lib-Suchverzeichnis für Ihr Projekt, um in den Verzeichnissen zu suchen, in denen die entsprechenden LIB- und H-Dateien vorhanden sind.

Das heißt, warum haben Sie das Bedürfnis, etwas anderes als die neueste CRT zu verwenden?


0
2018-02-18 15:15