AppContext AppContext AppContext AppContext Class

Definizione

Fornisce i membri per l'impostazione e il recupero dei dati relativi al contesto di un'applicazione.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
Ereditarietà
AppContextAppContextAppContextAppContext

Commenti

Il AppContext classe consente agli autori di librerie fornire un meccanismo uniforme di rifiuto esplicito per la nuova funzionalità per i propri utenti.The AppContext class enables library writers to provide a uniform opt-out mechanism for new functionality for their users. che stabilisce un contratto a regime di controllo libero ("loosely-coupled") tra componenti per poter comunicare una richiesta di rinuncia esplicita.It establishes a loosely-coupled contract between components in order to communicate an opt-out request. Questa funzionalità è importante in genere quando viene apportata una modifica alle funzionalità esistenti.This capability is typically important when a change is made to existing functionality. Al contrario, esiste già un consenso esplicito per la nuova funzionalità.Conversely, there is already an implicit opt-in for new functionality.

AppContext per gli sviluppatori di librerieAppContext for library developers

Usano le librerie di AppContext passa da una classe per definire ed esporre la compatibilità, mentre agli utenti della libreria possono impostare queste opzioni per influire sul comportamento delle librerie.Libraries use the AppContext class to define and expose compatibility switches, while library users can set those switches to affect the library behavior. Per impostazione predefinita, le librerie forniscono la nuova funzionalità e la modificano (cioè offrono la funzionalità precedente) solo se l'opzione è impostata.By default, libraries provide the new functionality, and they only alter it (that is, they provide the previous functionality) if the switch is set. Ciò consente alle librerie di fornire di nuovo comportamento per un'API esistente continuando a supportare i chiamanti che dipendono dal comportamento precedente.This allows libraries to provide new behavior for an existing API while continuing to support callers who depend on the previous behavior.

Che definisce il nome del commutatoreDefining the switch name

Il modo più comune per consentire agli utenti della libreria di rifiutare esplicitamente una modifica del comportamento consiste nel definire un parametro denominato.The most common way to allow consumers of your library to opt out of a change of behavior is to define a named switch. Relativi value elemento è una coppia nome/valore costituita dal nome di un commutatore e il relativo Boolean valore.Its value element is a name/value pair that consists of the name of a switch and its Boolean value. Per impostazione predefinita, l'opzione è sempre implicitamente false, che fornisce il nuovo comportamento (e rende il nuovo comportamento di fornire il consenso esplicito per impostazione predefinita).By default, the switch is always implicitly false, which provides the new behavior (and makes the new behavior opt-in by default). Impostare l'opzione su true consente, che fornisce il comportamento legacy.Setting the switch to true enables it, which provides the legacy behavior. Impostare in modo esplicito l'opzione su false fornisce inoltre il nuovo comportamento.Explicitly setting the switch to false also provides the new behavior.

È opportuno usare un formato coerente per i nomi dei commutatori, poiché si tratta di un contratto formale esposto da una libreria.It's beneficial to use a consistent format for switch names, since they are a formal contract exposed by a library. Di seguito sono riportati due formati ovvi.The following are two obvious formats.

  • Opzione.spaziodeinomi.nomeopzioneSwitch.namespace.switchname

  • Opzione.libreria.nomeopzioneSwitch.library.switchname

Dopo aver definito e il commutatore di documenti, i chiamanti possono usarlo con il Registro di sistema, aggiungendo un <AppContextSwitchOverrides > elemento per i file di configurazione dell'applicazione o chiamando il AppContext.SetSwitch(String, Boolean) metodo a livello di codice.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. Vedere le AppContext ai fruitori delle librerie sezione per altre informazioni sul modo in cui i chiamanti di usare, impostare il valore di AppContext opzioni di configurazione.See the AppContext for library consumers section for more information about how callers use and set the value of AppContext configuration switches.

Quando common language runtime viene eseguita un'applicazione, legge le impostazioni di compatibilità del Registro di sistema automaticamente e carica il file di configurazione dell'applicazione per popolare l'applicazione AppContext istanza.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. Poiché il AppContext istanza viene popolata a livello di codice dal chiamante o dal runtime, non è necessario intraprendere alcuna azione, ad esempio la chiamata di SetSwitch metodo, per configurare il AppContext istanza.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.

L'impostazione di controlloChecking the setting

È quindi possibile controllare se un consumer è dichiarato il valore del commutatore e agire in modo appropriato chiamando le AppContext.TryGetSwitch (metodo).You can then check if a consumer has declared the value of the switch and act appropriately by calling the AppContext.TryGetSwitch method. Il metodo restituisce true se il switchName si trova l'argomento e quando restituito dal metodo, la relativa isEnabled argomento indica il valore dell'opzione.The method returns true if the switchName argument is found, and when the method returns, its isEnabled argument indicates the value of the switch. In caso contrario, il metodo restituisce false.Otherwise, the method returns false.

un esempioAn example

Nell'esempio seguente viene illustrato l'utilizzo del AppContext classe per consentire al cliente di scegliere il comportamento originale di un metodo della libreria.The following example illustrates the use of the AppContext class to allow the customer to choose the original behavior of a library method. Di seguito è la versione 1.0 di una libreria denominata StringLibrary.The following is version 1.0 of a library named StringLibrary. Definisce un SubstringStartsAt metodo che esegue un confronto ordinale per determinare l'indice iniziale di una sottostringa all'interno di una stringa più grande.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

Nell'esempio seguente usa quindi la libreria per trovare l'indice iniziale della sottostringa "archæ" in "I archaeologist".The following example then uses the library to find the starting index of the substring "archæ" in "The archaeologist". Poiché il metodo esegue un confronto ordinale, Impossibile trovare la sottostringa.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'

Versione 2 della libreria, tuttavia, cambia il SubstringStartsAt metodo da utilizzare confronto con distinzione delle impostazioni cultura.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

Quando l'app viene ricompilata per eseguire la nuova versione della libreria, ora indica che la sottostringa "archæ" è stata trovata in corrispondenza dell'indice 4 in "I archaeologist".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

Questa modifica può essere evitata di violare le applicazioni che dipendono dal comportamento originale con la definizione di un <AppContextSwitchOverrides > passare.This change can be prevented from breaking the applications that depend on the original behavior by defining an <AppContextSwitchOverrides> switch. In questo caso, l'opzione è denominata StringLibrary.DoNotUseCultureSensitiveComparison.In this case, the switch is named StringLibrary.DoNotUseCultureSensitiveComparison. Il valore predefinito, false, indica che la libreria deve eseguire il confronto con distinzione delle impostazioni cultura versione 2.0.Its default value, false, indicates that the library should perform its version 2.0 culture-sensitive comparison. true indica che la libreria deve eseguire il confronto ordinale versione 1.0.true indicates that the library should perform its version 1.0 ordinal comparison. Apportare una piccola modifica del codice precedente consente al consumer di libreria impostare l'opzione per determinare il tipo di confronto che non viene eseguita.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

Se l'applicazione può quindi usare il file di configurazione seguente per ripristinare il comportamento della versione 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>

Quando l'applicazione viene eseguita con il file di configurazione presentano, produce l'output seguente:When the application is run with the configuration file present, it produces the following output:

'archæ' not found in 'The archaeologist'

AppContext per consumer della libreriaAppContext for library consumers

Se sei il consumer di una libreria, il AppContext classe consente di sfruttare i vantaggi di una libreria o il meccanismo di rifiuto esplicito del metodo della libreria per la nuova funzionalità.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. Singoli metodi della libreria di classi che si sta chiamando definiscono commutatori specifici che abilita o disabilita un nuovo comportamento.Individual methods of the class library that you are calling define particular switches that enable or disable a new behavior. Il valore dell'opzione è un valore booleano.The value of the switch is a Boolean. Se si tratta false, che in genere è il valore predefinito, il nuovo comportamento è abilitato; in caso true, il nuovo comportamento è disabilitato e il membro si comporta come accadeva in precedenza.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.

È possibile impostare il valore di un commutatore in uno dei quattro modi:You can set the value of a switch in one of four ways:

  • Chiamando il AppContext.SetSwitch(String, Boolean) metodo nel codice.By calling the AppContext.SetSwitch(String, Boolean) method in your code. Il switchName argomento definisce il nome del commutatore e il isEnabled proprietà definisce il valore dell'opzione.The switchName argument defines the switch name, and the isEnabled property defines the value of the switch. Poiché AppContext è una classe statica, è disponibile in base al dominio per ogni applicazione.Because AppContext is a static class, it is available on a per-application domain basis.

    La chiamata di AppContext.SetSwitch(String, Boolean) con ambito di applicazione; vale a dire, interessa solo l'applicazione.Calling the AppContext.SetSwitch(String, Boolean) has application scope; that is, it affects only the application.

  • Aggiungendo un <AppContextSwitchOverrides> elemento per il <runtime > sezione del file app. config.By adding an <AppContextSwitchOverrides> element to the <runtime> section of your app.config file. Il commutatore ha un solo attributo, value, il cui valore è una stringa che rappresenta una coppia chiave/valore che contiene sia il nome del commutatore e il relativo valore.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.

    Per definire più commutatori, separare coppia chiave/valore dell'opzione ogni nel <AppContextSwitchOverrides > dell'elemento value attributo con un punto e virgola.To define multiple switches, separate each switch's key/value pair in the <AppContextSwitchOverrides> element's value attribute with a semicolon. In tal caso, il <AppContextSwitchOverrides> elemento presenta il formato seguente:In that case, the <AppContextSwitchOverrides> element has the following format:

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

    Uso di <AppContextSwitchOverrides> elemento per definire un'impostazione di configurazione con ambito di applicazione; vale a dire, riguarda solo l'applicazione.Using the <AppContextSwitchOverrides> element to define a configuration setting has application scope; that is, it affects only the application.

    Nota

    Per informazioni sulle opzioni definite da .NET Framework, vedere la <AppContextSwitchOverrides > elemento.For information on the switches defined by the .NET Framework, see the <AppContextSwitchOverrides> element.

  • Tramite l'aggiunta di un valore di stringa il cui nome è il nome del commutatore per le HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext chiave del Registro di sistema.By adding a string value whose name is the name of the switch to the HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext key in the registry. Il valore deve essere la rappresentazione di stringa di un Boolean impostazione che può essere analizzato il Boolean.Parse (metodo), vale a dire deve essere "True", "true", "False" o "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". Se il runtime incontra un altro valore, l'opzione verrà ignorata.If the runtime encounters any other value, it ignores the switch.

    Uso del Registro di sistema per definire un AppContext commutatore con ambito computer; vale a dire, influisce su tutte le applicazioni in esecuzione nel computer.Using the registry to define an AppContext switch has machine scope; that is, it affects every application running on the machine.

  • Per le applicazioni ASP.NET, si aggiunge un <Aggiungi > elemento per il <appSettings > sezione del file Web. config.For ASP.NET applications, you add an <Add> element to the <appSettings> section of the web.config file. Ad esempio:For example:

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

Se si imposta la stessa opzione in diversi modi, è l'ordine di precedenza per determinare quale impostazione esegue l'override di altri:If you set the same switch in more than one way, the order of precedence for determining which setting overrides the others is:

  1. L'impostazione a livello di codice.The programmatic setting.

  2. L'impostazione nel file app. config o nel file Web. config.The setting in the app config file or the web.config file.

  3. L'impostazione del Registro di sistema.The registry setting.

Di seguito è riportato una semplice applicazione che passa un URI del file per il Path.GetDirectoryName (metodo).The following is a simple application that passes a file URI to the Path.GetDirectoryName method. Quando vengono eseguiti in .NET Framework 4.6, genera un ArgumentException perché file:// non è più una parte di un percorso file valida.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()

Per ripristinare il comportamento del metodo precedente ed evitare l'eccezione, è possibile aggiungere il Switch.System.IO.UseLegacyPathHandling passare al file di configurazione dell'applicazione per l'esempio: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>

Vedere ancheSee also

Opzione di AppContextAppContext switch

Proprietà

BaseDirectory BaseDirectory BaseDirectory BaseDirectory

Ottiene il percorso della directory base usata dal resolver dell'assembly per verificare la presenza di assembly.Gets the pathname of the base directory that the assembly resolver uses to probe for assemblies.

TargetFrameworkName TargetFrameworkName TargetFrameworkName TargetFrameworkName

Ottiene il nome della versione del framework di destinazione dell'applicazione corrente.Gets the name of the framework version targeted by the current application.

Metodi

GetData(String) GetData(String) GetData(String) GetData(String)

Restituisce il valore dell'elemento dati denominato assegnato al dominio applicazione corrente.Returns the value of the named data element assigned to the current application domain.

SetSwitch(String, Boolean) SetSwitch(String, Boolean) SetSwitch(String, Boolean) SetSwitch(String, Boolean)

Imposta il valore di un'opzione.Sets the value of a switch.

TryGetSwitch(String, Boolean) TryGetSwitch(String, Boolean) TryGetSwitch(String, Boolean) TryGetSwitch(String, Boolean)

Prova a ottenere il valore di un'opzione.Tries to get the value of a switch.

Si applica a

Vedi anche