다음을 통해 공유


.NET Framework에서 병렬 실행

비고

이 문서는 .NET Framework에만 적용됩니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

병렬 실행은 동일한 컴퓨터에서 여러 버전의 애플리케이션 또는 구성 요소를 실행하는 기능입니다. 동일한 컴퓨터에서 여러 버전의 공용 언어 런타임과 런타임 버전을 사용하는 여러 버전의 애플리케이션 및 구성 요소를 동시에 사용할 수 있습니다.

다음 그림에서는 동일한 컴퓨터에서 두 가지 버전의 런타임을 사용하는 여러 애플리케이션을 보여 줍니다. 애플리케이션 A, B 및 C는 런타임 버전 1.0을 사용하고 애플리케이션 D는 런타임 버전 1.1을 사용합니다.

다른 런타임 버전의 병렬 실행

.NET Framework는 공용 언어 런타임 및 API 형식을 포함하는 어셈블리 컬렉션으로 구성됩니다. 런타임 및 .NET Framework 어셈블리는 별도로 버전이 지정됩니다. 예를 들어 런타임 버전 4.0은 실제로 버전 4.0.319이고.NET Framework 어셈블리의 버전 1.0은 버전 1.0.3300.0입니다.

다음 그림에서는 동일한 컴퓨터에서 구성 요소의 두 가지 버전을 사용하는 여러 애플리케이션을 보여 줍니다. 애플리케이션 A와 B는 구성 요소의 버전 1.0을 사용하고, 애플리케이션 C는 동일한 구성 요소의 버전 2.0을 사용합니다.

구성 요소의 병렬 실행을 보여 주는 다이어그램

병렬 실행은 애플리케이션이 바인딩하는 구성 요소의 버전을 더 많이 제어하고 애플리케이션에서 사용하는 런타임 버전을 더 많이 제어할 수 있게 해줍니다.

병렬 실행의 이점

Windows XP 및 .NET Framework 이전에는 애플리케이션이 호환되지 않는 동일한 코드 버전을 구분할 수 없어 DLL 충돌이 발생했습니다. DLL에 포함된 형식 정보는 파일 이름에만 바인딩되었습니다. 애플리케이션은 DLL에 포함된 형식이 애플리케이션이 빌드된 형식과 동일한 형식인지 알 수 없었습니다. 따라서 새 버전의 구성 요소는 이전 버전을 덮어쓰고 애플리케이션을 중단시킬 수 있습니다.

병렬 실행 및 .NET Framework는 DLL 충돌을 제거하기 위해 다음 기능을 제공합니다.

  • 강력한 이름의 어셈블리

    병렬 실행은 강력한 이름의 어셈블리를 사용하여 특정 버전의 어셈블리에 형식 정보를 바인딩합니다. 이렇게 하면 애플리케이션 또는 구성 요소가 잘못된 버전의 어셈블리에 바인딩되지 않습니다. 강력한 이름의 어셈블리를 사용하면 여러 버전의 파일이 동일한 컴퓨터에 존재하고 애플리케이션에서 사용할 수 있습니다. 자세한 내용은 Strong-Named 어셈블리를 참조하세요.

  • 버전 인식 코드 스토리지.

    .NET Framework는 전역 어셈블리 캐시에 버전 인식 코드 스토리지를 제공합니다. 전역 어셈블리 캐시는 .NET Framework가 설치된 모든 컴퓨터에 있는 컴퓨터 전체 코드 캐시입니다. 버전, 문화권 및 게시자 정보를 기반으로 어셈블리를 저장하고 여러 버전의 구성 요소 및 애플리케이션을 지원합니다. 자세한 내용은 전역 어셈블리 캐시를 참조하십시오.

  • 격리.

    .NET Framework를 사용하여 격리된 상태로 실행되는 애플리케이션 및 구성 요소를 만들 수 있습니다. 격리는 병렬 실행의 필수 구성 요소입니다. 여기에는 사용 중인 리소스를 인식하고 여러 버전의 애플리케이션 또는 구성 요소 간에 안심하고 리소스를 공유하는 작업이 포함됩니다. 격리에는 버전별 방식으로 파일을 저장하는 것도 포함됩니다. 격리에 대한 자세한 내용은 병렬 실행을 위한 구성 요소 만들기 지침을 참조하세요.

버전 호환성

.NET Framework 버전 1.0 및 1.1은 서로 호환되도록 설계되었습니다. .NET Framework 버전 1.0으로 빌드된 애플리케이션은 버전 1.1에서 실행되어야 하며.NET Framework 버전 1.1로 빌드된 애플리케이션은 버전 1.0에서 실행되어야 합니다. 그러나 .NET Framework 버전 1.1에 추가된 API 기능은 .NET Framework 버전 1.0에서는 작동하지 않습니다. 버전 2.0으로 만든 애플리케이션은 버전 2.0에서만 실행됩니다. 버전 2.0 애플리케이션은 버전 1.1 이하에서 실행되지 않습니다.

.NET Framework 버전은 런타임 및 연결된 .NET Framework 어셈블리(어셈블리 통합이라고 하는 개념)로 구성된 단일 단위로 처리됩니다. 다른 버전의 .NET Framework 어셈블리를 포함하도록 어셈블리 바인딩을 리디렉션할 수 있지만 기본 어셈블리 바인딩을 재정의하는 것은 위험할 수 있으며 배포 전에 엄격하게 테스트해야 합니다.

런타임 버전 정보 찾기

애플리케이션 또는 구성 요소가 컴파일된 런타임 버전과 애플리케이션이 실행해야 하는 런타임 버전에 대한 정보는 두 위치에 저장됩니다. 애플리케이션 또는 구성 요소가 컴파일되면 컴파일하는 데 사용되는 런타임 버전에 대한 정보가 관리되는 실행 파일에 저장됩니다. 애플리케이션 또는 구성 요소에 필요한 런타임 버전에 대한 정보는 애플리케이션 구성 파일에 저장됩니다.

관리되는 실행 파일의 런타임 버전 정보

각 관리되는 애플리케이션 및 구성 요소의 PE(이식 가능한 실행 파일) 파일 헤더에는 빌드된 런타임 버전에 대한 정보가 포함되어 있습니다. 공용 언어 런타임은 이 정보를 사용하여 애플리케이션이 실행해야 하는 런타임의 가장 가능성이 큰 버전을 결정합니다.

애플리케이션 구성 파일의 런타임 버전 정보

PE 파일 헤더의 정보 외에도 런타임 버전 정보를 제공하는 애플리케이션 구성 파일을 사용하여 애플리케이션을 배포할 수 있습니다. 애플리케이션 구성 파일은 애플리케이션 개발자가 만들고 애플리케이션과 함께 제공되는 XML 기반 파일입니다. 이 파일에 있는 경우 시작< 섹션의>requiredRuntime< 요소는 런타임의 버전과 애플리케이션이 지원하는 구성 요소의 버전을 지정합니다.> 테스트할 때 이 파일을 사용하여 다른 버전의 런타임과 애플리케이션의 호환성을 테스트할 수도 있습니다.

COM 및 COM+ 애플리케이션을 비롯한 관리되지 않는 코드는 런타임에서 관리 코드와 상호 작용하는 데 사용하는 애플리케이션 구성 파일을 포함할 수 있습니다. 애플리케이션 구성 파일은 COM을 통해 활성화하는 모든 관리 코드에 영향을 줍니다. 파일은 어셈블리 리디렉션뿐만 아니라 지원하는 런타임 버전을 지정할 수 있습니다. 기본적으로 관리 코드를 호출하는 COM interop 애플리케이션은 컴퓨터에 설치된 최신 버전의 런타임을 사용합니다.

애플리케이션 구성 파일에 대한 자세한 내용은 앱 구성을 참조하세요.

로드할 런타임 버전 결정

공용 언어 런타임은 다음 정보를 사용하여 애플리케이션에 로드할 런타임 버전을 결정합니다.

  • 사용할 수 있는 런타임 버전입니다.

  • 애플리케이션에서 지원하는 런타임 버전입니다.

지원되는 런타임 버전

런타임은 애플리케이션 구성 파일과 PE(이식 가능한 실행 파일) 파일 헤더를 사용하여 애플리케이션이 지원하는 런타임 버전을 결정합니다. 애플리케이션 구성 파일이 없는 경우 런타임은 해당 버전을 사용할 수 있는 경우 애플리케이션의 PE 파일 헤더에 지정된 런타임 버전을 로드합니다.

애플리케이션 구성 파일이 있는 경우 런타임은 다음 프로세스의 결과에 따라 로드할 적절한 런타임 버전을 결정합니다.

  1. 런타임은 애플리케이션 구성 파일에서 <supportedRuntime> 요소 요소를 검사합니다. supportedRuntime 요소에< 지정된 지원되는 런타임 버전 중 하나 이상이 있는 경우 런타임>은 첫 번째 <supportedRuntime 요소에 지정된 런타임> 버전을 로드합니다. 이 버전을 사용할 수 없는 경우 런타임은 다음 <지원되는Runtime> 요소를 검사하고 지정된 런타임 버전을 로드하려고 시도합니다. 이 런타임 버전을 사용할 수 없는 경우 후속 <supportedRuntime> 요소가 검사됩니다. 지원되는 런타임 버전을 사용할 수 없는 경우 런타임은 런타임 버전을 로드하지 못하고 사용자에게 메시지를 표시합니다(3단계 참조).

  2. 런타임은 애플리케이션의 실행 파일의 PE 파일 헤더를 읽습니다. PE 파일 헤더에 지정된 런타임 버전을 사용할 수 있는 경우 런타임은 해당 버전을 로드합니다. 지정된 런타임 버전을 사용할 수 없는 경우 런타임은 MICROSOFT에서 PE 헤더의 런타임 버전과 호환되도록 결정된 런타임 버전을 검색합니다. 해당 버전을 찾을 수 없는 경우 프로세스는 3단계를 계속 진행합니다.

  3. 런타임은 애플리케이션에서 지원하는 런타임 버전을 사용할 수 없다는 메시지를 표시합니다. 런타임이 로드되지 않습니다.

    비고

    레지스트리 키 HKLM\Software\Microsoft\.NETFramework에서 NoGuiFromShim 값을 사용하거나 환경 변수 COMPLUS_NoGuiFromShim을 사용하여 이 메시지의 표시를 억제할 수 있습니다. 예를 들어 무인 설치 또는 Windows 서비스와 같이 일반적으로 사용자와 상호 작용하지 않는 애플리케이션에 대한 메시지를 표시하지 않을 수 있습니다. 이 메시지 표시가 숨겨지면 런타임은 이벤트 로그에 메시지를 기록합니다. 컴퓨터의 모든 애플리케이션에 대해 이 메시지를 표시하지 않는 레지스트리 값을 NoGuiFromShim을 1로 설정합니다. 또는 COMPLUS_NoGuiFromShim 환경 변수를 1로 설정하여 특정 사용자 컨텍스트에서 실행되는 애플리케이션에 대한 메시지를 표시하지 않습니다.

비고

런타임 버전이 로드된 후 어셈블리 바인딩 리디렉션은 개별 .NET Framework 어셈블리의 다른 버전을 로드할 것을 지정할 수 있습니다. 이러한 바인딩 리디렉션은 리디렉션되는 특정 어셈블리에만 영향을 줍니다.

부분적으로 정규화된 어셈블리 이름 및 병렬 실행

잠재적인 병렬 문제의 원인이므로 부분적으로 정규화된 어셈블리 참조는 애플리케이션 디렉터리 내의 어셈블리에 바인딩하는 데만 사용할 수 있습니다. 코드에서 부분적으로 정규화된 어셈블리 참조를 사용하지 마세요.

코드에서 부분적으로 정규화된 어셈블리 참조를 완화하기 위해 애플리케이션 구성 파일에서 <qualifyAssembly> 요소를 사용하여 코드에서 발생하는 부분 정규화된 어셈블리 참조를 정규화할 수 있습니다. <qualifyAssembly> 요소를 사용하여 부분 참조에 설정되지 않은 필드만 지정합니다. fullName 특성에 나열된 어셈블리 ID에는 어셈블리 이름을 정규화하는 데 필요한 모든 정보(어셈블리 이름, 공개 키, 문화권 및 버전)가 포함되어야 합니다.

다음 예제에서는 myAssembly라는 어셈블리를 완전히 식별하기 위한 애플리케이션 구성 파일 항목을 보여줍니다.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

어셈블리 로드 문이 myAssembly를 참조할 때마다 이러한 구성 파일 설정은 런타임에서 부분적으로 정규화된 myAssembly 참조를 완전하게 정규화된 참조로 자동 변환합니다. 예를 들어 Assembly.Load("myAssembly")는 Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral")가 됩니다.

비고

LoadWithPartialName 메서드를 사용하여 부분적으로 참조된 어셈블리가 전역 어셈블리 캐시에서 로드되는 것을 금지하는 공용 언어 런타임 제한을 무시할 수 있습니다. 이 메서드는 병렬 실행에서 쉽게 문제를 일으킬 수 있으므로 원격 시나리오에서만 사용해야 합니다.

제목 설명
방법: 자동 바인딩 리디렉션 활성화 및 비활성화 애플리케이션을 특정 버전의 어셈블리에 바인딩하는 방법을 설명합니다.
어셈블리 바인딩 리디렉션 구성 어셈블리 바인딩 참조를 특정 버전의 .NET Framework 어셈블리로 리디렉션하는 방법을 설명합니다.
In-Process 나란히 실행 프로세스 내 병렬 런타임 호스트 활성화를 사용하여 단일 프로세스에서 여러 버전의 CLR을 실행하는 방법에 대해 설명합니다.
.NET의 어셈블리 어셈블리의 개념적 개요를 제공합니다.
애플리케이션 도메인 애플리케이션 도메인에 대한 개념적 개요를 제공합니다.

참고 문헌

<supportedRuntime> 요소