사용자 모드 드라이버 및 데스크톱 앱과 함께 Microsoft C 런타임 사용

이 항목에서는 Windows 8 및 Windows 8.1용 응용 프로그램 및 드라이버를 사용하여 C 런타임 라이브러리를 배포하는 방법에 대한 정보를 제공합니다. 사용자 모드 드라이버 및 데스크톱 응용 프로그램 작성자가 코드를 컴파일하고 필요한 C 런타임 라이브러리와 함께 재배포하기 위해 패키지하는 방법에 대한 지침을 제공합니다.

  • CRT(C 런타임 라이브러리)는 더 이상 Windows 공유 구성 요소로 제공되지 않습니다.
  • Microsoft에서 이 변경 작업을 수행한 이유
  • C 런타임을 사용하여 코드 빌드
  • C 런타임 재배포
  • 권장되는 전략
  • C 런타임 라이브러리에 코드 연결
  • 요약 - 수행해야 하는 작업
  • 관련 항목

CRT(C 런타임 라이브러리)는 더 이상 Windows 공유 구성 요소로 제공되지 않습니다.

과거에는 Microsoft에서 CRT(C 런타임 라이브러리)를 창 공유 시스템 구성 요소로 배포했습니다. 이전 버전의 WDK에서는 드라이버 또는 일반적인 Windows 앱을 빌드할 때 Windows 시스템 버전의 CRT에 코드를 연결할 수 있었습니다. Windows 8 릴리스부터 C 런타임 라이브러리는 더 이상 시스템 구성 요소로 간주되지 않으며, 사용자 모드 드라이버 또는 데스크톱 응용 프로그램과 함께 재배포 가능한 버전의 CRT를 제공해야 합니다. 이 항목에서는 이러한 변경 이유, 새로운 C 런타임 구성 요소 및 데스크톱 앱 또는 드라이버를 빌드하고 CRT를 재배포하기 위한 전략을 설명합니다.

Microsoft에서 이 변경 작업을 수행한 이유

이제 별도의 C 런타임 버전 2개가 있습니다. 하나는 내부 Windows 구성 요소이고, 다른 하나는 응용 프로그램 및 드라이버 개발자용으로 Visual Studio 함께 제공됩니다. 이렇게 변경된 주요 이유는 일관성 및 고객을 위한 CRT 서비스 지원 때문입니다.

과거에는 응용 프로그램이 올바른 버전의 CRT DLL이 설치되지 않은 컴퓨터의 CRT 버전에 연결되는 경우가 있었습니다. 일반적인 공개 버전의 CRT를 사용하면 이 문제를 해결하는 데 도움이 됩니다.

이외에도, CRT 서비스가 복잡할 수 있습니다. Visual C 팀은 Visual Studio에 포함된 CRT의 정기 업데이트를 제공할 계획입니다. 권장되는 재배포 전략을 사용하면 응용 프로그램에 대해 이러한 변경 내용을 쉽게 적용할 수 있습니다. 또한 Windows 시스템 버전의 CRT 변경으로 인한 응용 프로그램 손상에 대해 염려할 필요가 없습니다.

이제 msvcrt.dll은 Windows에서 소유하고 빌드하는 시스템 구성 요소입니다. 시스템 수준 구성 요소에서만 사용됩니다. msvcr110.dll(Visual Studio 2012) 또는 msvcr120.dll(Microsoft Visual Studio 2013) 파일은 새로운 공개 버전의 CRT이며, 데스크톱 응용 프로그램과 사용자 모드 드라이버 개발자를 위한 것입니다.

C 런타임을 사용하여 코드 빌드

Visual C++는 개발 시스템의 System32 디렉터리에 최신 버전의 CRT를 설치합니다. 이 CRT는 개발자의 편의를 위해 설치됩니다. 그렇지 않으면 공유 CRT에 연결되고 Visual C++로 빌드된 모든 프로젝트는 디버깅 및 실행을 위해 빌드 디렉터리에 DLL 복사본이 있어야 합니다. msvcr120.dll은 Windows 8.1 및 Windows 8과 이전 버전의 Windows(Windows Vista부터 시작)를 대상으로 하는 드라이브에 사용할 수 있습니다.

C 런타임 재배포

Microsoft Visual Studio에서 사용자 모드 드라이버 또는 일반적인 데스크톱 응용 프로그램을 빌드하고 응용 프로그램에서 CRT(C 런타임 라이브러리)를 사용하는 경우 적절한 CRT 동적 연결 라이브러리를 배포해야 합니다.

권장되는 CRT 재배포 전략은 빌드할 응용 프로그램이 또는 드라이버 유형에 따라 달라집니다. Windows 8 및 Windows 8.1의 경우 Microsoft에서 Visual Studio에 포함된 Visual C++ 재배포 가능 패키지(VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_arm.exe)를 제공합니다. 개발자는 재배포 가능 패키지를 다른 이진 파일과 연결할 수 있습니다. 재배포 가능 패키지를 사용하는 경우 고객 컴퓨터의 C/C++ 런타임을 자동으로 서비스할 수 있습니다. 격리하려는 경우 특정 Visual C/C++ DLL을 다른 이진 파일과 함께 응용 프로그램 로컬 폴더에 정적으로 연결하거나 복사할 수 있습니다. 응용 프로그램 로컬 폴더는 응용 프로그램 실행 파일이 들어 있는 폴더입니다. 응용 프로그램 로컬 폴더에 DLL을 배포해야 합니다.

Visual C/C++ 재배포 가능 패키지(VCRedist_*.exe)는 응용 프로그램으로 서비스됩니다. 설치에 재배포 가능 패키지가 포함된 경우 초기 설치 시 최신 버전이 System32에 설치되며, Microsoft 업데이트 서비스를 사용하여 전체 패키지로 업데이트를 사용할 수 있습니다. Visual C/C++ 재배포 가능 패키지의 모든 구성 요소는 하나의 단위로 업데이트됩니다.

재배포 가능 패키지를 사용하지 않고 개별 CRT 구성 요소를 System32에 복사한 경우 해당 구성 요소는 자동으로 서비스되지 않으며 실수로 덮어쓸 수 있습니다.

드라이버가 CRT 구성 요소를 System32에 복사하고 다른 프로그램이 재배포 가능 패키지를 실행할 경우 문제가 발생할 수 있으며, 드라이버가 설치한 버전을 덮어씁니다. 그 반대의 경우에도 문제가 발생할 수 있습니다. 프로그램이 재배포 가능 패키지를 실행했으며 드라이버가 이전 버전의 CRT 구성 요소를 System32에 복사할 경우 응용 프로그램이 손상될 수 있습니다. INF 설치 프로세스에서는 단순히 System32에 있는 버전과 비교하여 설치할 라이브러리의 버전 번호를 확인하고 다를 경우 덮어씁니다.

권장되는 전략

C/C++ 런타임 구성 요소를 드라이버 및 응용 프로그램과 함께 재배포하는 경우 다음과 같은 전략을 사용합니다.

Program Files에 설치된 응용 프로그램의 경우:

  • System32에 CRT를 배포하는 Visual C++ 재배포 가능 패키지(VCRedist_x86.exe VCRedist_x64.exe, VCRedist_arm.exe)를 사용합니다. 이 경우 재배포 가능 패키지가 자동으로 업데이트될 수 있습니다.
  • 또는 응용 프로그램이 설치된 디렉터리에 직접 복사된 응용 프로그램 로컬 디렉터리에 DLL을 설치하거나 정적으로 CRT에 연결합니다. 이 경우 CRT를 수동으로 서비스해야 합니다.

프린터 드라이버의 경우:

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

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

[COPY_FILES]
;CRT
Msvcr120.dll
; other files

[SourceDisksFiles]
Msvcr120.dll = 2 
; other files

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

UMDF 드라이버의 경우:

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

C 런타임 라이브러리에 코드 연결

C 런타임 라이브러리 함수가 포함된 라이브러리는 다음과 같습니다.

용어 설명

Msvcr120.dll

C 런타임입니다.

Msvcp120.dll

C++ 런타임입니다.

Msvcr120d.dll

C 런타임의 디버그 버전입니다. 재배포할 수 없습니다.

Msvcp120d.dll

C++ 런타임의 디버그 버전입니다. 재배포할 수 없습니다.

 

응용 프로그램과 함께 재배포해야 하는 DLL을 결정하려면 응용 프로그램이 종속된 DLL 목록을 수집해야 합니다. 목록을 수집하는 한 가지 방법은 Dependency Walker(depends.exe)를 실행하는 것입니다.

종속성 목록이 있는 경우 Visual Studio 2013 Preview 및 Visual Studio 2013 SDK Preview용 재배포 가능 코드에 설명된 파일 목록과 비교합니다. 자세한 내용은 재배포할 DLL 결정배포 방법 선택을 참조하세요.

Visual Studio에 포함된 파일을 모두 재배포할 수는 없습니다. Visual Studio 2013 Preview 및 Visual Studio 2013 SDK Preview용 재배포 가능 코드에 지정된 파일만 재배포할 수 있습니다. 응용 프로그램 및 다양한 Visual C++ 동적 연결 라이브러리의 디버그 버전은 재배포할 수 없습니다.

요약 - 수행해야 하는 작업

가능한 경우 Visual C++ 재배포 가능 패키지(VCRedist_x86.exe VCRedist_x64.exe, VCRedist_arm.exe) VCRedist.msi를 설치 프로세스의 일부로 사용합니다.

프린터 드라이버의 경우 드라이버 저장소에 대한 CRT의 데스크톱 응용 프로그램 로컬 배포를 사용합니다.

UMDF 드라이버의 경우 드라이버 코드와 함께 CRT의 정적 연결을 사용합니다.

관련 항목

재배포할 DLL 결정

Visual Studio 2013 Preview 및 Visual Studio 2013 SDK Preview용 재배포 가능 코드

배포 방법 선택