Condividi tramite


Uso di Microsoft C Runtime con driver di User-Mode e app desktop

Se si creano applicazioni o driver per Windows 10, è sufficiente leggere questa sezione. Se si usa una versione di Visual Studio precedente a Visual Studio 2015, ignorare questa sezione e iniziare a Ridistribuire il runtime C (si applica a prima di Visual Studio 2015).

A partire da Visual Studio 2015, universal C Runtime (UCRT) include il runtime C. Le altre parti necessarie per un programma completo (funzionalità del linguaggio C/C++, libreria C++) vengono fornite da Visual Studio in VC++ Redistributable. Per evitare un requisito di ridistribuzione del runtime, tali parti sono collegate staticamente.

Avviso

Quando si compila un progetto driver in modalità utente in Visual Studio, se si imposta PlatformToolset su WindowsUserModeDriver10.0, il set di strumenti ignora qualsiasi libreria di runtime specificata nel progetto e collega invece staticamente al runtime VC++ e in modo dinamico rispetto a UCRT. Quando si usa questo set di strumenti, questo comportamento di collegamento ibrido non può essere riconfigurato.

Se non si usa il WindowsUserModeDriver10.0 set di strumenti, usare la procedura seguente per apportare modifiche, ad esempio includere un'altra DLL:

  1. Impostare per collegare staticamente: Proprietà > C/C++ > Libreria di runtime di generazione > del codice = multi-thread (/MT)
  2. Rimuovere l'UCRT collegato staticamente: Proprietà > Linker > Input > Ignora librerie predefinite specifiche += libucrt.lib
  3. Aggiungere l'UCRT collegato dinamicamente: > Proprietà Linker Input > dipendenze aggiuntive += ucrt.lib, Proprietà Linker >> Input > Ignora librerie predefinite specifiche += libucrt.lib >

Ridistribuizione del runtime C (applicabile a prima di Visual Studio 2015)

Nota

Tutte le informazioni seguenti si applicano solo al pre-2015. Prima del 2015, sono presenti due versioni separate del runtime C: il runtime di Visual C++ (VCRT, ad esempio msvcr120.dll) e windows CRT legacy (msvcrt.dll).

Visual Studio installa la versione più recente del VCRT nella System32 directory. Se il file non si trova in questo percorso, è possibile copiarlo direttamente nella directory di compilazione del progetto Visual C++.

Se l'applicazione driver in modalità utente o desktop usa VCRT, è necessario distribuire le librerie di collegamento dinamiche appropriate. Usare il pacchetto Visual C++ Redistributable (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_arm.exe). Concatenare il pacchetto ridistribuibile in con altri file binari e il pacchetto ridistribuibile riceverà aggiornamenti automatici.

Se si vuole ottenere l'isolamento o evitare la dipendenza da VC++ Redistributable, è possibile collegare staticamente a CRT. Anche se i progetti non driver sono in genere in grado di copiare le DLL di Visual C/C++ specifiche nella cartella locale dell'applicazione (in cui l'applicazione è installata) per evitare una dipendenza dalla distribuzione ridistribuibile VC++, la distribuzione locale dell'app non è appropriata per un driver.

Non copiare singoli componenti System32 CRT in anziché usare un pacchetto ridistribuibile. Ciò può causare la sovrascrittitura automatica del servizio CRT e potenzialmente sovrascritto.

Le considerazioni speciali seguenti si applicano ai driver della stampante:

  • Questi driver devono includere i file CRT necessari in INF, quindi i file CRT vengono copiati nell'archivio driver come parte del payload del driver.
  • I driver di stampa V4 non possono usare un co-installer per l'installazione, quindi INF deve copiare file binari pertinenti della libreria di runtime C/C++ nell'archivio driver. A tale scopo, fare riferimento ai file appropriati nella sezione [COPY_FILES] del pacchetto driver.
  • I driver di stampa V3 non devono usare co-installer per la configurazione, poiché non vengono eseguiti durante le connessioni point e print. Questi driver devono fare riferimento ai file appropriati nella sezione [COPY_FILES] del pacchetto driver.

Di seguito è riportato un esempio di come includere i file binari CRT nella sezione [COPY_FILES] di un INF:

[COPY_FILES]
;CRT
Msvcr120.dll
; other files

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

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

Per i driver UMDF:

  • Collegare staticamente il driver a CRT per includere il runtime nel file binario. In questo caso, non è necessario ridistribuire il CRT.

Collegamento del codice con le librerie di runtime C (si applica a prima di Visual Studio 2015)

Per determinare quali DLL è necessario ridistribuire con l'applicazione, raccogliere un elenco delle DLL che l'applicazione dipende. Un modo per raccogliere l'elenco consiste nell'eseguire Dependency Walker (depends.exe).

Per altre informazioni, vedere Determinazione delle DLL da ridistribuire e scegliere un metodo di distribuzione.

Non è possibile ridistribuire tutti i file inclusi in Visual Studio; è consentito ridistribuire i file specificati nel codice ridistribuibile per Visual Studio 2013 anteprima e Visual Studio 2013 SDK Preview. Le versioni di debug delle applicazioni e le varie librerie di collegamento dinamico di Visual C++ non sono ridistribuibili.

Le librerie seguenti contengono le funzioni della libreria di runtime C:

Termine Descrizione
Msvcr120.dll Runtime C
Msvcp120.dll Runtime C++
Msvcr120d.dll Versione di debug del runtime C : nessuna ridistribuzione consentita
Msvcp120d.dll Versione di debug del runtime C++ - Nessuna ridistribuzione consentita