AppContext 클래스

정의

애플리케이션의 컨텍스트에 대한 데이터를 설정 및 검색하기 위한 멤버를 제공합니다.Provides members for setting and retrieving data about an application's context.

public ref class AppContext abstract sealed
public static class AppContext
type AppContext = class
Public Class AppContext
상속
AppContext

설명

라이브러리 작성자는 AppContext 클래스를 사용 하 여 사용자의 새 기능에 대해 일관 된 옵트아웃 메커니즘을 제공할 수 있습니다.The AppContext class enables library writers to provide a uniform opt-out mechanism for new functionality for their users. 옵트아웃(opt out) 요청을 전달하기 위해 구성 요소 간에 느슨하게 결합된 계약을 설정합니다.It establishes a loosely-coupled contract between components in order to communicate an opt-out request. 이 기능은 일반적으로 기존 기능이 변경될 때 중요합니다.This capability is typically important when a change is made to existing functionality. 반대로, 새로운 기능에 대한 암시적 옵트인(opt in)은 이미 있습니다.Conversely, there is already an implicit opt-in for new functionality.

라이브러리 개발자를 위한 AppContextAppContext for library developers

라이브러리는 AppContext 클래스를 사용 하 여 호환성 스위치를 정의 및 노출 하는 반면 라이브러리 사용자는 라이브러리 동작에 영향을 주는 스위치를 설정할 수 있습니다.Libraries use the AppContext class to define and expose compatibility switches, while library users can set those switches to affect the library behavior. 기본적으로 라이브러리는 새로운 기능을 제공하며 스위치가 설정된 경우에만 변경합니다(즉, 이전 기능 제공).By default, libraries provide the new functionality, and they only alter it (that is, they provide the previous functionality) if the switch is set. 이렇게 하면 라이브러리 이전 동작에 의존 하는 호출자를 지원 하면서 기존 API에 대 한 새 동작을 제공할 수 있습니다.This allows libraries to provide new behavior for an existing API while continuing to support callers who depend on the previous behavior.

스위치 이름 정의Defining the switch name

변경 된 동작을 옵트아웃 하려면 라이브러리의 소비자를 허용 하는 가장 일반적인 방법은 명명 된 스위치를 정의 하는 경우The most common way to allow consumers of your library to opt out of a change of behavior is to define a named switch. value 요소는 스위치 이름과 Boolean 값으로 구성 되는 이름/값 쌍입니다.Its value element is a name/value pair that consists of the name of a switch and its Boolean value. 기본적으로 스위치는 항상 암시적으로 false되며 새 동작을 제공 하 고 기본적으로 새 동작 옵트인 (opt in)을 만듭니다.By default, the switch is always implicitly false, which provides the new behavior (and makes the new behavior opt-in by default). 스위치를 true 설정 하면 레거시 동작이 제공 됩니다.Setting the switch to true enables it, which provides the legacy behavior. 스위치를 명시적으로 false로 설정 하면 새 동작도 제공 됩니다.Explicitly setting the switch to false also provides the new behavior.

라이브러리에 의해 노출 되는 공식 계약 이므로 스위치 이름에 대 한 일관 된 형식을 사용 하는 것이 좋습니다.It's beneficial to use a consistent format for switch names, since they are a formal contract exposed by a library. 다음은 두 가지 명확한 형식입니다.The following are two obvious formats.

  • Switch.namespace.switchnameSwitch.namespace.switchname

  • Switch.library.switchnameSwitch.library.switchname

정의 하 고 스위치를 문서화 하면 호출자가 사용할 수 추가 하 여 레지스트리를 사용 하 여는 <AppContextSwitchOverrides > 요소를 호출 하거나 해당 애플리케이션 구성 파일에는 AppContext.SetSwitch(String, Boolean) 메서드에 프로그래밍 방식으로 합니다.Once you define and document the switch, callers can use it by using the registry, by adding an <AppContextSwitchOverrides> element to their application configuration file, or by calling the AppContext.SetSwitch(String, Boolean) method programmatically. 호출자가를 사용 하 고 AppContext 구성 스위치의 값을 설정 하는 방법에 대 한 자세한 내용은 library 소비자를 위한 Appcontext 섹션을 참조 하세요.See the AppContext for library consumers section for more information about how callers use and set the value of AppContext configuration switches.

공용 언어 런타임 애플리케이션 실행 될 때 자동으로 레지스트리의 호환성 설정을 읽고 애플리케이션을 채우기 위해 애플리케이션 구성 파일을 로드 AppContext 인스턴스.When the common language runtime runs an application, it automatically reads the registry's compatibility settings and loads the application configuration file in order to populate the application's AppContext instance. AppContext 인스턴스는 호출자 또는 런타임에 의해 프로그래밍 방식으로 채워지기 때문에 SetSwitch 메서드를 호출 하는 등의 작업을 수행 하지 않아도 AppContext 인스턴스를 구성할 수 있습니다.Because the AppContext instance is populated either programmatically by the caller or by the runtime, you do not have to take any action, such as calling the SetSwitch method, to configure the AppContext instance.

설정 확인Checking the setting

그런 다음 소비자가 스위치 값을 선언 했는지 확인 하 고 AppContext.TryGetSwitch 메서드를 호출 하 여 적절 하 게 작동 하는지 확인할 수 있습니다.You can then check if a consumer has declared the value of the switch and act appropriately by calling the AppContext.TryGetSwitch method. 메서드는 switchName 인수를 찾은 경우 true를 반환 하 고, 메서드가 반환 될 때 해당 isEnabled 인수는 스위치의 값을 나타냅니다.The method returns true if the switchName argument is found, and when the method returns, its isEnabled argument indicates the value of the switch. 그렇지 않은 경우 메서드는 false를 반환합니다.Otherwise, the method returns false.

예제An example

다음 예제에서는 AppContext 클래스를 사용 하 여 고객이 라이브러리 메서드의 원래 동작을 선택할 수 있도록 하는 방법을 보여 줍니다.The following example illustrates the use of the AppContext class to allow the customer to choose the original behavior of a library method. 다음은 StringLibrary된 라이브러리 버전 1.0입니다.The following is version 1.0 of a library named StringLibrary. 이 메서드는 서 수 비교를 수행 하 여 더 큰 문자열에 있는 부분 문자열의 시작 인덱스를 결정 하는 SubstringStartsAt 메서드를 정의 합니다.It defines a SubstringStartsAt method that performs an ordinal comparison to determine the starting index of a substring within a larger string.

using System;
using System.Reflection;

[assembly: AssemblyVersion("1.0.0.0")]

public static class StringLibrary
{
   public static int SubstringStartsAt(String fullString, String substr)
   {
      return fullString.IndexOf(substr, StringComparison.Ordinal);
   }
}
Imports System.Reflection

<Assembly: AssemblyVersion("1.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.Ordinal)
   End Function
End Class

다음 예제에서는 다음 라이브러리를 사용 하 여 "고고학자"에서 "archæ" 부분 문자열의 시작 인덱스를 찾을 수 합니다.The following example then uses the library to find the starting index of the substring "archæ" in "The archaeologist". 서 수 비교를 수행 하는 메서드, 때문에 부분 문자열을 찾을 수 없습니다.Because the method performs an ordinal comparison, the substring cannot be found.

using System;

public class Example
{
   public static void Main()
   {
      String value = "The archaeologist";
      String substring = "archæ";
      int position = StringLibrary.SubstringStartsAt(value, substring); 
      if (position >= 0) 
         Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position);
      else
         Console.WriteLine("'{0}' not found in '{1}'", substring, value);
   }
}
// The example displays the following output:
//       'archæ' not found in 'The archaeologist'
Public Module Example
   Public Sub Main()
      Dim value As String = "The archaeologist"
      Dim substring As String = "archæ"
      Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring) 
      If position >= 0 Then 
         Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
      Else
         Console.WriteLine("'{0}' not found in '{1}'", substring, value)
      End If                  
   End Sub
End Module
' The example displays the following output:
'       'archæ' not found in 'The archaeologist'

그러나 라이브러리의 버전 2는 문화권 구분 비교를 사용 하도록 SubstringStartsAt 메서드를 변경 합니다.Version 2 of the library, however, changes the SubstringStartsAt method to use culture-sensitive comparison.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary
{
   public static int SubstringStartsAt(String fullString, String substr)
   {
      return fullString.IndexOf(substr, StringComparison.CurrentCulture);
   }
}
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
   End Function
End Class

라이브러리의 새 버전에서 실행 되도록 앱을 다시 컴파일하면에 이제 "고고학자"에서 인덱스 4에서 사용 하는 부분 문자열 "archæ" 찾을 수 있는지 보고 합니다.When the app is recompiled to run against the new version of the library, it now reports that the substring "archæ" is found at index 4 in "The archaeologist".

using System;

public class Example
{
   public static void Main()
   {
      String value = "The archaeologist";
      String substring = "archæ";
      int position = StringLibrary.SubstringStartsAt(value, substring); 
      if (position >= 0) 
         Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position);
      else
         Console.WriteLine("'{0}' not found in '{1}'", substring, value);
   }
}
// The example displays the following output:
//       'archæ' found in 'The archaeologist' starting at position 4   
Public Module Example
   Public Sub Main()
      Dim value As String = "The archaeologist"
      Dim substring As String = "archæ"
      Dim position As Integer = StringLibrary.SubstringStartsAt(value, substring) 
      If position >= 0 Then 
         Console.WriteLine("'{0}' found in '{1}' starting at position {2}",
                        substring, value, position)
      Else
         Console.WriteLine("'{0}' not found in '{1}'", substring, value)
      End If                  
   End Sub
End Module
' The example displays the following output:
'       'archæ' found in 'The archaeologist' starting at position 4

이 변경은 주요 정의 하 여 원래 동작에 종속 된 애플리케이션에서 방지할 수 있습니다는 <AppContextSwitchOverrides > 전환 합니다.This change can be prevented from breaking the applications that depend on the original behavior by defining an <AppContextSwitchOverrides> switch. 이 경우 스위치의 이름은 StringLibrary.DoNotUseCultureSensitiveComparison입니다.In this case, the switch is named StringLibrary.DoNotUseCultureSensitiveComparison. 기본값 false는 라이브러리에서 해당 버전 2.0 문화권 구분 비교를 수행 해야 함을 나타냅니다.Its default value, false, indicates that the library should perform its version 2.0 culture-sensitive comparison. true 라이브러리에서 버전 1.0 서 수 비교를 수행 해야 함을 나타냅니다.true indicates that the library should perform its version 1.0 ordinal comparison. 앞의 코드를 약간 수정 메서드가 수행 하는 비교의 종류를 결정 하는 스위치를 설정 하려면 라이브러리 소비자를 허용 합니다.A slight modification of the previous code allows the library consumer to set the switch to determine the kind of comparison the method performs.

using System;
using System.Reflection;

[assembly: AssemblyVersion("2.0.0.0")]

public static class StringLibrary
{
   public static int SubstringStartsAt(String fullString, String substr)
   {
      bool flag;
      if (AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", out flag) && flag == true)
         return fullString.IndexOf(substr, StringComparison.Ordinal);
      else
         return fullString.IndexOf(substr, StringComparison.CurrentCulture);
   }
}
Imports System.Reflection

<Assembly: AssemblyVersion("2.0.0.0")>

Public Class StringLibrary
   Public Shared Function SubstringStartsAt(fullString As String, substr As String) As Integer
      Dim flag As Boolean
      If AppContext.TryGetSwitch("StringLibrary.DoNotUseCultureSensitiveComparison", flag) AndAlso flag = True Then
         Return fullString.IndexOf(substr, StringComparison.Ordinal)
      Else
         Return fullString.IndexOf(substr, StringComparison.CurrentCulture)
      End If   
   End Function
End Class

그런 다음 애플리케이션 버전 1.0 동작을 복원 하려면 다음 구성 파일을 사용 수 있습니다.If application can then use the following configuration file to restore the version 1.0 behavior.


<configuration>
   <runtime>
      <AppContextSwitchOverrides value="StringLibrary.DoNotUseCultureSensitiveComparison=true" />
   </runtime>
</configuration>

애플리케이션이 있는 구성 파일을 사용 하 여 실행 되 면 다음 출력이 생성 됩니다.When the application is run with the configuration file present, it produces the following output:

'archæ' not found in 'The archaeologist'

라이브러리 소비자에 대 한 AppContextAppContext for library consumers

라이브러리의 소비자 인 경우 AppContext 클래스를 사용 하 여 새 기능에 대 한 라이브러리 또는 라이브러리 메서드의 옵트아웃 메커니즘을 활용할 수 있습니다.If you are the consumer of a library, the AppContext class allows you to take advantage of a library or library method's opt-out mechanism for new functionality. 개별 메서드를 호출 하는 클래스 라이브러리의 새 동작을 사용할지 여부를 지정 하는 특정 스위치를 정의 합니다.Individual methods of the class library that you are calling define particular switches that enable or disable a new behavior. 스위치의 값은 부울입니다.The value of the switch is a Boolean. 이 값이 false(일반적으로 기본값) 이면 새 동작이 사용 됩니다. true되는 경우 새 동작을 사용할 수 없으며 멤버가 이전 처럼 동작 합니다.If it is false, which is typically the default value, the new behavior is enabled; if it is true, the new behavior is disabled, and the member behaves as it did previously.

네 가지 방법 중 하나에 스위치의 값을 설정할 수 있습니다.You can set the value of a switch in one of four ways:

  • 코드에서 AppContext.SetSwitch(String, Boolean) 메서드를 호출 합니다.By calling the AppContext.SetSwitch(String, Boolean) method in your code. switchName 인수는 스위치 이름을 정의 하 고 isEnabled 속성은 스위치의 값을 정의 합니다.The switchName argument defines the switch name, and the isEnabled property defines the value of the switch. AppContext는 정적 클래스 이므로 응용 프로그램 도메인 별로 사용할 수 있습니다.Because AppContext is a static class, it is available on a per-application domain basis.

    호출 된 AppContext.SetSwitch(String, Boolean) 애플리케이션 범위에만 애플리케이션에 영향을 주므로, 합니다.Calling the AppContext.SetSwitch(String, Boolean) has application scope; that is, it affects only the application.

  • <AppContextSwitchOverrides> 요소를 app.config 파일의 <runtime > 섹션에 추가 합니다.By adding an <AppContextSwitchOverrides> element to the <runtime> section of your app.config file. 스위치에는 단일 특성 value있습니다. 값은 스위치 이름과 해당 값을 모두 포함 하는 키/값 쌍을 나타내는 문자열입니다.The switch has a single attribute, value, whose value is a string that represents a key/value pair containing both the switch name and its value.

    여러 스위치를 정의 하려면 <AppContextSwitchOverrides 의 각 스위치의 키/값 쌍을 세미콜론으로 > 요소의 value 특성을 구분 합니다.To define multiple switches, separate each switch's key/value pair in the <AppContextSwitchOverrides> element's value attribute with a semicolon. 이 경우 <AppContextSwitchOverrides> 요소의 형식은 다음과 같습니다.In that case, the <AppContextSwitchOverrides> element has the following format:

    <AppContextSwitchOverrides value="switchName1=value1;switchName2=value2" />
    

    사용 하는 <AppContextSwitchOverrides> 구성 설정을 정의 하는 요소에는 애플리케이션 범위에만 애플리케이션에 영향을 주므로,.Using the <AppContextSwitchOverrides> element to define a configuration setting has application scope; that is, it affects only the application.

    참고

    .NET Framework에서 정의 된 스위치에 대 한 자세한 내용은 <AppContextSwitchOverrides > 요소를 참조 하세요.For information on the switches defined by the .NET Framework, see the <AppContextSwitchOverrides> element.

  • 레지스트리의 HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext 키에 대 한 스위치의 이름인 문자열 값을 추가 합니다.By adding a string value whose name is the name of the switch to the HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext key in the registry. 해당 값은 Boolean.Parse 메서드에서 구문 분석할 수 있는 Boolean의 문자열 표현 이어야 합니다. 즉, "True", "true", "False" 또는 "false" 여야 합니다.Its value must be the string representation of a Boolean that can be parsed by the Boolean.Parse method; that is, it must be "True", "true", "False", or "false". 런타임에 다른 값에서 발견 하는 경우 스위치를 무시 합니다.If the runtime encounters any other value, it ignores the switch.

    레지스트리를 사용 하 여 정의 하는 AppContext 스위치 컴퓨터 범위에는 컴퓨터에서 실행 중인 모든 애플리케이션에 영향을 주므로, 합니다.Using the registry to define an AppContext switch has machine scope; that is, it affects every application running on the machine.

  • ASP.NET 애플리케이션에 대 한 추가 <추가 > 요소를 <appSettings > web.config 파일의 섹션입니다.For ASP.NET applications, you add an <Add> element to the <appSettings> section of the web.config file. 예를 들면 다음과 같습니다.For example:

    <appSettings>
        <add key="AppContext.SetSwitch:switchName1" value="switchValue1" />
        <add key="AppContext.SetSwitch:switchName2" value="switchValue2" />
    </appSettings>
    

둘 이상의 방식으로 동일한 스위치를 설정 하면 다른 어떤 설정이 재정의 확인 하기 위한 우선 순위는:If you set the same switch in more than one way, the order of precedence for determining which setting overrides the others is:

  1. 프로그래밍 방식으로 설정 합니다.The programmatic setting.

  2. 앱 구성 파일 또는 web.config 파일에 설정입니다.The setting in the app config file or the web.config file.

  3. 레지스트리 설정입니다.The registry setting.

다음은 파일 URI를 전달 하는 간단한 애플리케이션에는 Path.GetDirectoryName 메서드.The following is a simple application that passes a file URI to the Path.GetDirectoryName method. .NET Framework 4.6에서 실행 되는 경우 file://가 더 이상 파일 경로의 올바른 부분이 아니기 때문에 ArgumentException을 throw 합니다.When run under the .NET Framework 4.6, it throws an ArgumentException because file:// is no longer a valid part of a file path.

using System;
using System.IO;
using System.Runtime.Versioning;

[assembly:TargetFramework(".NETFramework,Version=v4.6.2")]

public class Example
{
   public static void Main()
   {
      Console.WriteLine(Path.GetDirectoryName("file://c/temp/dirlist.txt")); 
   }
}
// The example displays the following output:
//    Unhandled Exception: System.ArgumentException: The path is not of a legal form.
//       at System.IO.Path.NewNormalizePathLimitedChecks(String path, Int32 maxPathLength, Boolean expandShortPaths)
//       at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
//       at System.IO.Path.InternalGetDirectoryName(String path)
//       at Example.Main()
Imports System.IO
Imports System.Runtime.Versioning

<assembly:TargetFramework(".NETFramework,Version=v4.6.2")>

Module Example
   Public Sub Main()
      Console.WriteLine(Path.GetDirectoryName("file://c/temp/dirlist.txt")) 
   End Sub
End Module
' The example displays the following output:
'    Unhandled Exception: System.ArgumentException: The path is not of a legal form.
'       at System.IO.Path.NewNormalizePathLimitedChecks(String path, Int32 maxPathLength, Boolean expandShortPaths)
'       at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
'       at System.IO.Path.InternalGetDirectoryName(String path)
'       at Example.Main()

메서드의 이전 동작을 복원 하 고 예외를 방지 하려면 추가 Switch.System.IO.UseLegacyPathHandling 예제 애플리케이션 구성 파일에 전환:To restore the method's previous behavior and prevent the exception, you can add the Switch.System.IO.UseLegacyPathHandling switch to the application configuration file for the example:

<configuration>
    <runtime>
        <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=true" />
    </runtime>
</configuration>

참고 항목See also

AppContext 스위치AppContext switch

속성

BaseDirectory

어셈블리 확인자에서 어셈블리를 조사하는 데 사용하는 기본 디렉터리의 경로 이름을 가져옵니다.Gets the pathname of the base directory that the assembly resolver uses to probe for assemblies.

TargetFrameworkName

현재 애플리케이션의 대상인 프레임워크 버전의 이름을 가져옵니다.Gets the name of the framework version targeted by the current application.

메서드

GetData(String)

현재 애플리케이션 도메인에 할당되어 있는 명명된 데이터 요소의 값을 반환합니다.Returns the value of the named data element assigned to the current application domain.

SetSwitch(String, Boolean)

스위치의 값을 설정합니다.Sets the value of a switch.

TryGetSwitch(String, Boolean)

스위치의 값을 가져오려고 합니다.Tries to get the value of a switch.

적용 대상

추가 정보