Compartir vía


Uso de Microsoft C Runtime con controladores de User-Mode y aplicaciones de escritorio

Si va a compilar aplicaciones o controladores para Windows 10, solo tiene que leer esta sección. Si usa una versión de Visual Studio anterior a Visual Studio 2015, omita esta sección y empiece por Redistribuir el tiempo de ejecución de C (se aplica a antes de Visual Studio 2015).

A partir de Visual Studio 2015, el runtime de C universal (UCRT) abarca el entorno de ejecución de C. Visual Studio proporciona las demás partes necesarias para un programa completo (características del lenguaje C/C++, biblioteca de C++) en VC++ Redistributable. Para evitar un requisito de redistribución en tiempo de ejecución, esas partes están vinculadas estáticamente.

Advertencia

Al compilar un proyecto de controlador en modo de usuario en Visual Studio, si establece PlatformToolsetWindowsUserModeDriver10.0en , el conjunto de herramientas omite cualquier biblioteca en tiempo de ejecución especificada en el proyecto y, en su lugar, se vincula estáticamente con el runtime de VC++ y dinámicamente en UCRT. Al usar este conjunto de herramientas, no se puede volver a configurar este comportamiento de vinculación híbrida.

Si no usa el WindowsUserModeDriver10.0 conjunto de herramientas, use el procedimiento siguiente para realizar modificaciones (por ejemplo, incluya otro archivo DLL):

  1. Se establece para vincular estáticamente en general: Propiedades C > /C++ > Code Generation > Runtime Library = Multi-threaded (/MT)
  2. Quite el UCRT vinculado estáticamente: Las entradas del enlazador >> de propiedades > omiten bibliotecas predeterminadas específicas += libucrt.lib
  3. Agregue el UCRT vinculado dinámicamente: Properties Linker >> Input > Additional Dependencies += ucrt.lib, Properties > Linker > Input > Ignore Specific Default Libraries += libucrt.lib

Redistribuir el runtime de C (se aplica a antes de Visual Studio 2015)

Nota:

Toda la información debajo de este punto solo se aplica a las versiones anteriores a 2015. Antes de 2015, había dos versiones independientes del runtime de C: el entorno de ejecución de Visual C++ (VCRT, por ejemplo msvcr120.dll) y el CRT de Windows heredado (msvcrt.dll).

Visual Studio instala la versión más reciente de VCRT en el System32 directorio . Si el archivo no está en esta ubicación, puede copiarlo directamente en el directorio de compilación del proyecto de Visual C++.

Si la aplicación de escritorio o controlador en modo de usuario usa VCRT, debe distribuir las bibliotecas de vínculos dinámicos adecuadas. Use el paquete de Visual C++ Redistributable (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_arm.exe). Encadene el paquete redistribuible en con otros archivos binarios y el paquete redistribuible recibirá actualizaciones automáticas.

Si desea lograr aislamiento o evitar la dependencia de VC++ Redistributable, puede vincularse estáticamente a CRT en su lugar. Aunque los proyectos que no son controladores suelen ser capaces de copiar los archivos DLL específicos de Visual C/C++ en la carpeta local de la aplicación (donde está instalada la aplicación) para evitar una dependencia de VC++ Redistributable, la implementación local de la aplicación no es adecuada para un controlador.

No copie componentes de CRT individuales en System32 lugar de usar un paquete redistribuible. Esto puede hacer que el CRT no se service automáticamente y, posiblemente, se sobrescriba.

Las siguientes consideraciones especiales se aplican a los controladores de impresora:

  • Estos controladores deben incluir los archivos CRT necesarios en el INF, por lo que los archivos CRT se copian en el almacén de controladores como parte de la carga del controlador.
  • Los controladores de impresión V4 no pueden usar un co-instalador para la instalación, por lo que INF debe copiar los archivos binarios pertinentes de la biblioteca en tiempo de ejecución de C/C++ en el almacén de controladores. Para ello, haga referencia a los archivos adecuados en la sección [COPY_FILES] del paquete de controladores.
  • Los controladores de impresión V3 no deben usar co-instaladores para la instalación, ya que no se ejecutan durante las conexiones de punto e impresión. Estos controladores deben hacer referencia a los archivos adecuados en la sección [COPY_FILES] del paquete de controladores.

A continuación se muestra un ejemplo de cómo incluir los archivos binarios de CRT en la sección [COPY_FILES] de un INF:

[COPY_FILES]
;CRT
Msvcr120.dll
; other files

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

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

Para los controladores UMDF:

  • Vincule estáticamente el controlador con el CRT para incluir el tiempo de ejecución en el binario. En este caso, no es necesario redistribuir el CRT.

Vinculación del código con las bibliotecas en tiempo de ejecución de C (se aplica a antes de Visual Studio 2015)

Para determinar qué archivos DLL debe redistribuir con la aplicación, recopile una lista de los archivos DLL de los que depende la aplicación. Una manera de recopilar la lista es ejecutar Dependency Walker (depends.exe).

Para obtener más información, vea Determinar qué archivos DLL redistribuir y elegir un método de implementación.

No se pueden redistribuir todos los archivos incluidos en Visual Studio; Solo se le permite redistribuir los archivos que se especifican en Código redistribuible para Visual Studio 2013 versión preliminar y Visual Studio 2013 versión preliminar del SDK. Las versiones de depuración de aplicaciones y las distintas bibliotecas de vínculos dinámicos de Visual C++ no se pueden redistribuir.

Las bibliotecas siguientes contienen las funciones de la biblioteca en tiempo de ejecución de C:

Término Descripción
Msvcr120.dll Tiempo de ejecución de C
Msvcp120.dll Tiempo de ejecución de C++
Msvcr120d.dll Versión de depuración del entorno de ejecución de C: no se permite la redistribución
Msvcp120d.dll Versión de depuración del entorno de ejecución de C++: no se permite la redistribución