Dela via


Använda Microsoft C Runtime med User-Mode-drivrutiner och skrivbordsappar

Om du skapar program eller drivrutiner för Windows 10 behöver du bara läsa det här avsnittet. Om du använder en version av Visual Studio tidigare än Visual Studio 2015 hoppar du över det här avsnittet och börjar med att distribuera C Runtime (gäller för före Visual Studio 2015).

Från och med Visual Studio 2015 omfattar Universal C Runtime (UCRT) C-körbiblioteket. De andra delarna som krävs för ett fullständigt program (C/C++-språkfunktioner, C++-bibliotek) tillhandahålls av Visual Studio i VC++ Redistributable. För att undvika omdistributionskrav under körtid länkas dessa delar statiskt.

Varning

När du skapar ett drivrutinsprojekt i användarläge i Visual Studio, om du anger PlatformToolset till WindowsUserModeDriver10.0, ignorerar verktygsuppsättningen alla körningsbibliotek som anges i projektet och länkar i stället statiskt mot VC++ Runtime och dynamiskt mot UCRT. När du använder den här verktygsuppsättningen kan inte det här hybridlänkningsbeteendet konfigureras om.

Om du inte använder verktygsuppsättningen WindowsUserModeDriver10.0 använder du följande procedur för att göra ändringar (till exempel inkludera en annan DLL):

  1. Ange för statisk länkning i allmänhet: Egenskaper > C/C++ > Kodgenerering > Körningsbibliotek = Multi-threaded (/MT)
  2. Ta bort den statiskt länkade UCRT: Egenskaper > Länkare > Inmatning > Ignorera specifika standardbibliotek += libucrt.lib
  3. Lägg till dynamiskt länkade UCRT: Egenskaper > Länkare > Input > Ytterligare beroenden += ucrt.lib, Egenskaper > Länkare > Input > Ignorera specifika standardbibliotek += libucrt.lib

Omdistribuera C Runtime (gäller för före Visual Studio 2015)

Anmärkning

All information under den här punkten gäller endast före 2015. Före 2015 fanns det två separata versioner av C Runtime: Visual C++ Runtime (till exempel msvcr120.dllVCRT) och den äldre Windows CRT (msvcrt.dll).

Visual Studio installerar den senaste versionen av VCRT i System32 katalogen. Om filen inte finns på den här platsen kan du kopiera den direkt till byggkatalogen för ditt Visual C++-projekt.

Om drivrutinen för användarläget eller skrivbordsprogrammet använder VCRT måste du distribuera lämpliga dynamiska länkbibliotek. Använd Visual C++ Redistributable Package (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_arm.exe). Länka det omdistribuerbara paketet med andra binärfiler så får det omdistribuerbara paketet automatiska uppdateringar.

Om du vill uppnå isolering eller undvika beroendet av VC++ Redistributable kan du länka statiskt till CRT i stället. Även om projekt som inte är drivrutinsprojekt vanligtvis kan kopiera specifika Visual C/C++-DLL:er till den lokala programmappen (där programmet är installerat) för att undvika ett beroende av VC++ Redistributable, är app-local deployment inte lämplig för en drivrutin.

Kopiera inte enskilda CRT-komponenter till i stället för att System32 använda ett omdistribuerbart paket. Detta kan leda till att CRT inte kan hanteras automatiskt och eventuellt skrivas över.

Följande särskilda överväganden gäller för skrivardrivrutiner:

  • Dessa drivrutiner bör innehålla de nödvändiga CRT-filerna i INF, så CRT-filerna kopieras till drivrutinsarkivet som en del av drivrutinsnyttolasten.
  • V4-utskriftsdrivrutiner kan inte använda ett installationsprogram för installation, så INF måste kopiera relevanta binärfiler för C/C++-körningsbiblioteket till drivrutinsarkivet. Det gör du genom att referera till lämpliga filer i avsnittet [COPY_FILES] i drivrutinspaketet.
  • V3-utskriftsdrivrutiner bör inte använda medinstallationsprogram för installation, eftersom dessa inte körs under Point and Print-anslutningar. Dessa drivrutiner bör referera till lämpliga filer i avsnittet [COPY_FILES] i drivrutinspaketet.

Följande är ett exempel på hur du inkluderar CRT-binärfilerna i avsnittet [COPY_FILES] i en INF:

[COPY_FILES]
;CRT
Msvcr120.dll
; other files

* [SourceDisksFiles]
Msvcr120.dll = 2 
; other files

* [SourceDisksNames.amd64]
1 = %Location%,,,
2 = %Location%,,,"amd64"

För UMDF-drivrutiner:

  • Länka drivrutinen statiskt mot CRT för att inkludera körningen i binärfilen. I det här fallet behöver du inte omdistribuera CRT.

Länka koden till C Runtime-biblioteken (gäller för före Visual Studio 2015)

För att avgöra vilka DLL:er som du måste distribuera med ditt program samlar du in en lista över de DLL:er som programmet är beroende av. Ett sätt att samla in listan är att köra Dependency Walker (depends.exe).

Mer information finns i Fastställa vilka DLL:er som ska distribueras och välja en distributionsmetod.

Du kan inte omdistribuera alla filer som ingår i Visual Studio. du får bara distribuera om filerna som anges i Redistributable Code for Visual Studio 2013 Preview och Visual Studio 2013 SDK Preview. Felsökningsversioner av program och de olika Visual C++-biblioteken för dynamisk länk kan inte omdistribueras.

Följande bibliotek innehåller C-körningsbiblioteksfunktionerna:

Begrepp Beskrivning
Msvcr120.dll C-körtid
Msvcp120.dll C++-körning
Msvcr120d.dll Felsökningsversion av C-körtidsbibliotek – ingen omdistribution tillåts
Msvcp120d.dll Felsökningsversion av C++-körbibliotek – ingen omdistribution tillåts