Share via


User-Mode 드라이버 및 데스크톱 앱에서 Microsoft C 런타임 사용

Windows 10 애플리케이션 또는 드라이버를 빌드하는 경우 이 섹션을 읽기만 하면 됩니다. Visual Studio 2015 이전 버전의 Visual Studio를 사용하는 경우 이 섹션을 건너뛰고 C 런타임 재배포로 시작합니다(Visual Studio 2015 이전에 적용됨).

Visual Studio 2015부터 UCRT(유니버설 C 런타임)는 C 런타임을 포함합니다. 전체 프로그램에 필요한 다른 부분(C/C++ 언어 기능, C++ 라이브러리)은 VC++ 재배포 가능 패키지의 Visual Studio에서 제공합니다. 런타임 재배포 요구 사항을 방지하기 위해 이러한 조각은 정적으로 연결됩니다.

경고

Visual Studio에서 사용자 모드 드라이버 프로젝트를 빌드할 때 PlatformToolsetWindowsUserModeDriver10.0로 설정하면 도구 집합은 프로젝트에 지정된 모든 런타임 라이브러리를 무시하고 대신 VC++ 런타임에 대해 정적으로 연결하고 UCRT에 대해 동적으로 연결합니다. 이 도구 집합을 사용하는 경우 이 하이브리드 연결 동작을 다시 구성할 수 없습니다.

도구 집합을 WindowsUserModeDriver10.0 사용하지 않는 경우 다음 절차를 사용하여 수정합니다(예: 다른 DLL 포함).

  1. 일반적으로 정적으로 연결하도록 설정: 속성 > C/C++ > 코드 생성 > 런타임 라이브러리 = 다중 스레드(/MT)
  2. 정적으로 연결된 UCRT 제거: 속성 > 링커 > 입력 > 특정 기본 라이브러리 무시 += libucrt.lib
  3. 동적으로 연결된 UCRT 추가: 속성 > 링커 > 입력 > 추가 종속성 += ucrt.lib, 속성 > 링커 > 입력 > 특정 기본 라이브러리 무시 += libucrt.lib

C 런타임 재배포(Visual Studio 2015 이전에 적용됨)

참고

이 시점 아래의 모든 정보는 2015년 이전의 경우에만 적용됩니다. 2015년 이전에는 Visual C++ 런타임(예 msvcr120.dll: VCRT) 및 레거시 Windows CRT()의 두 가지 개별 버전의 C 런타임이msvcrt.dll 있었습니다.

Visual Studio는 최신 버전의 VCRT System32 를 디렉터리에 설치합니다. 파일이 이 위치에 없는 경우 Visual C++ 프로젝트의 빌드 디렉터리에 직접 복사할 수 있습니다.

사용자 모드 드라이버 또는 데스크톱 애플리케이션이 VCRT를 사용하는 경우 적절한 동적 링크 라이브러리를 배포해야 합니다. Visual C++ 재배포 가능 패키지 패키지(VCRedist_x86.exe, , VCRedist_x64.exe)를 VCRedist_arm.exe사용합니다. 재배포 가능 패키지를 다른 이진 파일과 연결하면 재배포 가능 패키지가 자동 업데이트를 받습니다.

격리를 달성하거나 VC++ 재배포 가능 패키지에 대한 종속성을 방지하려면 대신 CRT에 정적으로 연결할 수 있습니다. 드라이버가 아닌 프로젝트는 일반적으로 VC++ 재배포 가능 패키지에 대한 종속성을 방지하기 위해 특정 Visual C/C++ DLL을 애플리케이션 로컬 폴더 (애플리케이션이 설치된 위치)에 복사할 수 있지만 앱 로컬 배포는 드라이버에 적합하지 않습니다.

재배포 가능 패키지를 사용하는 대신 개별 CRT 구성 요소를 System32 에 복사하지 마세요. 이로 인해 CRT가 자동으로 서비스되지 않고 잠재적으로 덮어쓰여질 수 있습니다.

프린터 드라이버에는 다음과 같은 특별한 고려 사항이 적용됩니다.

  • 이러한 드라이버는 INF에 필요한 CRT 파일을 포함해야 하므로 CRT 파일은 드라이버 페이로드의 일부로 드라이버 저장소에 복사됩니다.
  • V4 인쇄 드라이버는 설치에 공동 설치 관리자를 사용할 수 없으므로 INF는 C/C++ 런타임 라이브러리의 관련 이진 파일을 드라이버 저장소에 복사해야 합니다. 이렇게 하려면 드라이버 패키지의 [COPY_FILES] 섹션에서 적절한 파일을 참조하세요.
  • V3 인쇄 드라이버는 지점 및 인쇄 연결 중에 실행되지 않으므로 설치에 공동 설치 관리자를 사용하면 안 됩니다. 이러한 드라이버는 드라이버 패키지의 [COPY_FILES] 섹션에서 적절한 파일을 참조해야 합니다.

다음은 INF의 [COPY_FILES] 섹션에 CRT 이진 파일을 포함하는 방법의 예입니다.

[COPY_FILES]
;CRT
Msvcr120.dll
; other files

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

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

UMDF 드라이버의 경우:

  • 드라이버를 CRT에 정적으로 연결하여 런타임을 이진 파일에 포함합니다. 이 경우 CRT를 재배포할 필요가 없습니다.

C 런타임 라이브러리와 코드 연결(Visual Studio 2015 이전에 적용됨)

애플리케이션과 재배포해야 하는 DLL을 확인하려면 애플리케이션이 의존하는 DLL 목록을 수집합니다. 목록을 수집하는 한 가지 방법은 Dependency Walker(depends.exe)를 실행하는 것입니다.

자세한 내용은 재배포할 DLL 확인배포 방법 선택을 참조하세요.

Visual Studio에 포함된 모든 파일을 재배포할 수 없습니다. Visual Studio 2013 미리 보기 및 Visual Studio 2013 SDK 미리 보기용 재배포 가능 코드에 지정된 파일만 재배포할 수 있습니다. 애플리케이션 및 다양한 Visual C++ 동적 링크 라이브러리의 디버그 버전은 재배포할 수 없습니다.

다음 라이브러리에는 C 런타임 라이브러리 함수가 포함되어 있습니다.

용어 Description
Msvcr120.dll C 런타임
Msvcp120.dll C++ 런타임
Msvcr120d.dll C 런타임의 디버그 버전 - 재배포가 허용되지 않음
Msvcp120d.dll C++ 런타임의 디버그 버전 - 재배포가 허용되지 않음