Verwenden der Microsoft C Runtime mit User-Mode-Treibern und Desktop-Apps
Wenn Sie Anwendungen oder Treiber für Windows 10 erstellen, müssen Sie nur diesen Abschnitt lesen. Wenn Sie eine Frühere Version von Visual Studio als Visual Studio 2015 verwenden, überspringen Sie diesen Abschnitt, und beginnen Sie mit der Neuverteilung der C-Runtime (gilt für vor Visual Studio 2015).
Ab Visual Studio 2015 umfasst die Universal C Runtime (UCRT) die C-Runtime. Die anderen Elemente, die für ein vollständiges Programm (C/C++-Sprachfeatures, C++-Bibliothek) erforderlich sind, werden von Visual Studio in der VC++ Redistributable bereitgestellt. Um eine Laufzeitumverteilungsanforderung zu vermeiden, werden diese Teile statisch verknüpft.
Warnung
Wenn Sie beim Erstellen eines Benutzermodustreiberprojekts in Visual Studio PlatformToolset auf WindowsUserModeDriver10.0
festlegen, ignoriert das Toolset jede im Projekt angegebene Laufzeitbibliothek und verknüpft stattdessen statisch mit der VC++-Runtime und dynamisch mit dem UCRT. Bei Verwendung dieses Toolsets kann dieses Hybridverknüpfungsverhalten nicht neu konfiguriert werden.
Wenn Sie das WindowsUserModeDriver10.0
Toolset nicht verwenden, führen Sie das folgende Verfahren aus, um Änderungen vorzunehmen (z. B. fügen Sie eine andere DLL ein):
- Im Allgemeinen auf statisch verknüpfen: Eigenschaften > C/C++ > Code Generation > Runtime Library = Multithreaded (/MT)
- Entfernen Sie den statisch verknüpften UCRT: Eigenschaften > Linker-Eingabe >> Bestimmte Standardbibliotheken ignorieren += libucrt.lib
- Hinzufügen des dynamisch verknüpften UCRT: Properties > Linker > Input > Additional Dependencies += ucrt.lib, Properties > Linker > Input > Ignore Specific Default Libraries += libucrt.lib
Verteilen der C-Runtime (gilt für vor Visual Studio 2015)
Hinweis
Alle Informationen unter diesem Punkt gelten nur für vor 2015. Vor 2015 gab es zwei separate Versionen der C-Runtime: die Visual C++-Runtime (VCRT, z. B. msvcr120.dll
) und die Ältere Windows CRT (msvcrt.dll
).
Visual Studio installiert die neueste Version des VCRT in das System32
Verzeichnis. Wenn sich die Datei nicht an diesem Speicherort befindet, können Sie sie direkt in das Buildverzeichnis Ihres Visual C++-Projekts kopieren.
Wenn Ihr Benutzermodustreiber oder Ihre Desktopanwendung den VCRT verwendet, müssen Sie die entsprechenden Dynamic Link-Bibliotheken verteilen. Verwenden Sie das Visual C++ Redistributable-Paket (VCRedist_x86.exe
, VCRedist_x64.exe
, VCRedist_arm.exe
). Verketten Sie das verteilbare Paket mit anderen Binärdateien, und das verteilbare Paket erhält automatische Updates.
Wenn Sie eine Isolation erreichen oder die Abhängigkeit von der VC++ Redistributable vermeiden möchten, können Sie stattdessen statisch mit dem CRT verknüpfen. Während Projekte ohne Treiber in der Regel in der Lage sind, die spezifischen Visual C/C++-DLLs in den lokalen Anwendungsordner (in dem die Anwendung installiert ist) zu kopieren, um eine Abhängigkeit vom VC++ Redistributable zu vermeiden, ist die lokale App-Bereitstellung für einen Treiber nicht geeignet.
Kopieren Sie nicht einzelne CRT-Komponenten in, anstatt ein verteilbares Paket zu System32
verwenden. Dies kann dazu führen, dass das CRT nicht automatisch gewartet und möglicherweise überschrieben wird.
Für Druckertreiber gelten die folgenden besonderen Aspekte:
- Diese Treiber sollten die erforderlichen CRT-Dateien im INF enthalten, sodass die CRT-Dateien als Teil der Treibernutzlast in den Treiberspeicher kopiert werden.
- V4-Drucktreiber können kein Co-Installer für das Setup verwenden, daher muss der INF relevante Binärdateien der C/C++-Laufzeitbibliothek in den Treiberspeicher kopieren. Verweisen Sie hierzu auf die entsprechenden Dateien im Abschnitt [COPY_FILES] des Treiberpakets.
- V3-Drucktreiber sollten keine Co-Installer für das Setup verwenden, da sie während der Point- und Print-Verbindungen nicht ausgeführt werden. Diese Treiber sollten auf die entsprechenden Dateien im Abschnitt [COPY_FILES] des Treiberpakets verweisen.
Im Folgenden finden Sie ein Beispiel für die Aufnahme der CRT-Binärdateien in den Abschnitt [COPY_FILES] eines INF:
[COPY_FILES]
;CRT
Msvcr120.dll
; other files
* [SourceDisksFiles]
Msvcr120.dll = 2
; other files
* [SourceDisksNames.amd64]
1 = %Location%,,,
2 = %Location%,,,"amd64"
Für UMDF-Treiber:
- Verknüpfen Sie Ihren Treiber statisch mit dem CRT, um die Runtime in die Binärdatei einzuschließen. In diesem Fall müssen Sie die CRT nicht weiterverteilen.
Verknüpfen Ihres Codes mit den C-Runtime-Bibliotheken (gilt für vor Visual Studio 2015)
Um zu bestimmen, welche DLLs Sie mit Ihrer Anwendung verteilen müssen, sammeln Sie eine Liste der DLLs, von denen Ihre Anwendung abhängt. Eine Möglichkeit zum Sammeln der Liste besteht darin, Dependency Walker (depends.exe
) auszuführen.
Weitere Informationen finden Sie unter Bestimmen der zu verteilenden DLLs und Auswählen einer Bereitstellungsmethode.
Sie können nicht alle Dateien, die in Visual Studio enthalten sind, verteilen. Sie dürfen nur die Dateien verteilen, die in Redistributable Code for Visual Studio 2013 Preview und Visual Studio 2013 SDK Preview angegeben sind. Debugversionen von Anwendungen und den verschiedenen Visual C++-Bibliotheken für dynamische Verknüpfungen sind nicht verteilbar.
Die folgenden Bibliotheken enthalten die C-Laufzeitbibliotheksfunktionen:
Begriff | Beschreibung |
---|---|
Msvcr120.dll | C-Runtime |
Msvcp120.dll | C++-Runtime |
Msvcr120d.dll | Debugversion der C-Runtime – keine Neuverteilung zulässig |
Msvcp120d.dll | Debugversion der C++-Runtime – keine Neuverteilung zulässig |