어셈블리 섀도 복사

섀도 복사를 사용하면 응용 프로그램 도메인을 언로드하지 않고도 응용 프로그램 도메인에 사용된 어셈블리를 업데이트할 수 있습니다. 섀도 복사는 ASP.NET 사이트와 같이 계속해서 사용할 수 있어야 하는 응용 프로그램에 특히 유용합니다.

공용 언어 런타임에서는 어셈블리가 로드될 때 어셈블리 파일을 잠그므로 어셈블리가 언로드되기 전까지는 파일을 업데이트할 수 없습니다. 응용 프로그램 도메인에서 어셈블리를 언로드하는 유일한 방법은 응용 프로그램 도메인을 언로드하는 것이므로 일반적인 경우에는 어셈블리를 사용하고 있는 응용 프로그램 도메인이 모두 언로드될 때까지 디스크에서 어셈블리를 업데이트할 수 없습니다.

응용 프로그램 도메인이 파일을 섀도 복사할 수 있도록 구성되어 있으면 응용 프로그램 경로의 어셈블리가 다른 위치에 복사되고 이 위치에서 로드됩니다. 복사본은 잠겨 있지만 원본 어셈블리 파일은 잠겨 있지 않으므로 업데이트할 수 있습니다.

중요중요

응용 프로그램 디렉터리 또는 하위 디렉터리에 저장된 어셈블리만 섀도 복사할 수 있습니다. 이러한 디렉터리는 응용 프로그램 도메인이 구성될 때 ApplicationBasePrivateBinPath 속성으로 지정됩니다.전역 어셈블리 캐시에 저장된 어셈블리는 섀도 복사되지 않습니다.

이 문서는 다음과 같은 단원으로 구성됩니다.

  • 섀도 복사 활성화 및 사용: 기본적인 사용 방법 및 섀도 복사에 사용할 수 있는 옵션을 설명합니다.

  • 시작 성능: 시작 성능을 향상시키기 위해 .NET Framework 버전 4에서 섀도 복사가 어떻게 변경되었는지 설명하고 이 동작을 이전 버전으로 되돌리는 방법을 설명합니다.

  • 사용되지 않는 메서드: .NET Framework 2.0에서 섀도 복사를 제어하던 속성과 메서드가 어떻게 변경되었는지 설명합니다. 

섀도 복사 활성화 및 사용

다음과 같이 AppDomainSetup 클래스의 속성을 사용하여 섀도 복사를 위한 응용 프로그램 도메인을 구성할 수 있습니다.

  • ShadowCopyFiles 속성을 문자열 값 "true"로 설정하여 섀도 복사가 가능하도록 설정합니다.

    기본적으로 이렇게 설정하면 응용 프로그램 경로의 모든 어셈블리가 로드되기 전에 다운로드 캐시에 복사됩니다. 다운로드 캐시는 다른 컴퓨터에서 다운로드한 파일을 저장하기 위해 공용 언어 런타임에서 관리하는 캐시이며 더 이상 필요 없는 파일은 공용 언어 런타임에서 자동으로 삭제됩니다.

  • 필요한 경우 CachePath 속성과 ApplicationName 속성을 사용하여 섀도 복사된 파일의 사용자 지정 위치를 설정합니다.

    이 위치의 기본 경로는 하위 디렉터리를 나타내는 CachePath 속성에 ApplicationName 속성이 연결되어 만들어집니다. 어셈블리는 기본 경로 자체가 아니라 이 경로의 하위 디렉터리에 섀도 복사됩니다.

    참고참고

    ApplicationName 속성이 설정되어 있지 않으면 CachePath 속성은 무시되고 다운로드 캐시가 사용됩니다.예외가 throw되지 않습니다.

    사용자 지정 위치를 지정하면 해당 디렉터리와 복사된 파일이 더 이상 필요하지 않아도 자동으로 삭제되지 않으므로 사용자가 직접 해당 디렉터리와 파일을 정리해야 합니다.

    섀도 복사된 파일의 사용자 지정 위치를 설정하는 몇 가지 이유가 있습니다. 첫째, 응용 프로그램에서 생성하는 복사본이 많을 경우 섀도 복사된 파일의 사용자 지정 위치를 설정하는 것이 좋을 수 있습니다. 다운로드 캐시는 수명이 아니라 크기에 제한을 받으므로 공용 언어 런타임에서 아직 사용 중인 파일을 삭제하려고 할 수도 있기 때문입니다. 둘째, 공용 언어 런타임에서 다운로드 캐시에 사용하는 디렉터리 위치에 대한 쓰기 권한이 응용 프로그램을 실행하는 사용자에게 없는 경우 사용자 지정 위치를 설정합니다.

  • 필요한 경우 ShadowCopyDirectories 속성을 사용하여 섀도 복사되는 어셈블리를 제한합니다.

    응용 프로그램 도메인의 섀도 복사가 가능하도록 설정하면 기본적으로 응용 프로그램 경로, 즉 ApplicationBasePrivateBinPath 속성으로 지정된 디렉터리의 모든 어셈블리가 복사됩니다. 섀도 복사할 디렉터리만 들어 있는 문자열을 만들고 ShadowCopyDirectories 속성에 이 문자열을 할당하여 선택한 디렉터리만 복사되도록 할 수 있습니다. 각 디렉터리는 세미콜론으로 구분합니다. 이렇게 하면 선택한 디렉터리에 있는 어셈블리만 섀도 복사됩니다.

    중요중요

    세미콜론은 구분 기호 문자이므로 디렉터리 경로에 포함하면 안 됩니다.세미콜론에 대한 이스케이프 문자는 없습니다.

시작 성능

섀도 복사를 사용하는 응용 프로그램 도메인을 시작할 때 응용 프로그램 디렉터리의 어셈블리를 섀도 복사 디렉터리로 복사하거나 어셈블리가 이미 해당 위치에 있는지 확인하는 동안 시작이 지연될 수 있습니다. .NET Framework 4 이전 버전에서는 다음과 같은 순서로 작업이 진행되었습니다. 우선 모든 어셈블리를 임시 디렉터리로 복사합니다. 어셈블리 이름을 확인하기 위해 각 어셈블리를 열고 강력한 이름의 유효성을 검사합니다. 그런 다음 각 어셈블리가 섀도 복사 디렉터리의 복사본보다 더 최근에 업데이트된 것인지 여부를 확인합니다. 어셈블리가 섀도 복사본보다 더 최근에 업데이트된 것이면 이를 섀도 복사 디렉터리로 복사합니다. 마지막으로 임시 복사본을 삭제합니다.

.NET Framework 4부터는 응용 프로그램 디렉터리에 있는 각 어셈블리의 파일 날짜 및 시간을 섀도 복사 디렉터리에 있는 복사본의 파일 날짜 및 시간과 직접 비교하도록 기본 시작 동작이 변경되었습니다. 어셈블리가 업데이트되었으면 이전 버전의 .NET Framework와 같은 절차를 통해 어셈블리를 복사합니다. 어셈블리가 업데이트되지 않았으면 섀도 복사 디렉터리의 복사본을 로드합니다.

그 결과로, 어셈블리가 자주 변경되지 않거나 어셈블리의 소규모 하위 집합에서만 주로 변경이 이루어지는 응용 프로그램에 대해 성능을 크게 향상시킬 수 있습니다. 그러나 응용 프로그램의 어셈블리가 대부분 자주 변경된다면 새로 적용한 기본 동작 때문에 성능이 오히려 저하될 수 있습니다. 이 경우 <shadowCopyVerifyByTimestamp> 요소를 구성 파일에 추가하고 enabled="false"를 설정하여 이전 버전의 .NET Framework로 시작 동작을 되돌릴 수 있습니다.

사용되지 않는 메서드

AppDomain 클래스에는 응용 프로그램 도메인의 섀도 복사를 제어하는 데 사용할 수 있는 SetShadowCopyFilesClearShadowCopyPath와 같은 몇 개의 메서드가 있지만 .NET Framework 버전 2.0에서는 이러한 메서드가 더 이상 사용되지 않는 것으로 표시되었습니다. 따라서 섀도 복사가 가능하도록 응용 프로그램 도메인을 구성하려면 AppDomainSetup 클래스의 속성을 사용하는 것이 좋습니다.

참고 항목

참조

AppDomainSetup.ShadowCopyFiles

AppDomainSetup.CachePath

AppDomainSetup.ApplicationName

AppDomainSetup.ShadowCopyDirectories

기타 리소스

<shadowCopyVerifyByTimestamp>요소