System.Configuration.ConfigurationManager Simple dictionary config factory config is a dictionary mapping key->value <add key="name" value="text"> sets key=text <remove key="name"> removes the definition of key <clear> removes all definitions Given a partially composed config object (possibly null) and some input from the config system, return a further partially composed config object Make the name of the key attribute configurable by derived classes. Make the name of the value attribute configurable by derived classes. Used to satisfy legacy interfaces. Replace one file with another, retrying if locked. Components should implement this interface if they want to persist custom settings in a hosting application. This interface allows the application author to tell a control whether to persist, when to load, save etc. Indicates to the implementor that settings should be persisted. Unique key that identifies an individual instance of a settings group(s). This key is needed to identify which instance of a component owns a given group(s) of settings. Usually, the component will frame its own key, but this property allows the hosting application to override it if necessary. Tells the component to load its settings. Tells the component to save its settings. Tells the component to reset its settings. Typically, the component can call Reset on its settings class(es). Base settings class for client applications. Default constructor without a concept of "owner" component. Constructor that takes an IComponent. The IComponent acts as the "owner" of this settings class. One of the things we do is query the component's site to see if it has a SettingsProvider service. If it does, we allow it to override the providers specified in the metadata. Convenience overload that takes the settings key Convenience overload that takes the owner component and settings key. The Context to pass on to the provider. Currently, this will just contain the settings group name. The SettingsBase class queries this to get the collection of SettingsProperty objects. We reflect over the properties defined on the current object's type and use the metadata on those properties to form this collection. Just overriding to add attributes. Provider collection Derived classes should use this to uniquely identify separate instances of settings classes. Fires when the value of a setting is changed. (INotifyPropertyChanged implementation.) Fires when the value of a setting is about to change. This is a cancellable event. Fires when settings are retrieved from a provider. It fires once for each provider. Fires when Save() is called. This is a cancellable event. Used in conjunction with Upgrade - retrieves the previous value of a setting from the provider. Provider must implement IApplicationSettingsProvider to support this. Fires the PropertyChanged event. Fires the SettingChanging event. Fires the SettingsLoaded event. Fires the SettingsSaving event. Causes a reload to happen on next setting access, by clearing the cached values. Calls Reset on the providers. Providers must implement IApplicationSettingsProvider to support this. Overridden from SettingsBase to support validation event. Overridden from SettingsBase to support validation event. Called when the app is upgraded so that we can instruct the providers to upgrade their settings. Providers must implement IApplicationSettingsProvider to support this. Creates a SettingsProperty object using the metadata on the given property and returns it. Ensures this class is initialized. Initialization involves reflecting over properties and building a list of SettingsProperty's. Returns a SettingsProperty used to initialize settings. We initialize a setting with values derived from class level attributes, if present. Otherwise, we initialize to reasonable defaults. Gets all the settings properties for this provider. Retrieves the value of a setting. We need this method so we can fire the SettingsLoaded event when settings are loaded from the providers.Ideally, this should be fired from SettingsBase, but unfortunately that will not happen in Whidbey. Instead, we check to see if the value has already been retrieved. If not, we fire the load event, since we expect SettingsBase to load all the settings from this setting's provider. Returns true if this is a clickonce deployed app. Only those settings class properties that have a SettingAttribute on them are treated as settings. This routine filters out other properties. Resets the provider collection. This needs to be called when providers change after first being set. Indicates that a setting is to be stored on a per-application basis. The AppSettingsReader class provides a wrapper for System.Configuration.ConfigurationManager.AppSettings which provides a single method for reading values from the config file of a particular type. Gets the value for specified key from ConfigurationManager.AppSettings, and returns an object of the specified type containing the value from the config file. If the key isn't in the config file, or if it is not a valid value for the given type, it will throw an exception with a descriptive message so the user can make the appropriate change Translate an ExeDefinition string from the Declaration in a file to the appropriate enumeration string representation of value [optional] - can provide better error Add implicit sections to the specified factory list. The factory list to add to. If null, adds to the current record's factory list. ConfigurationSection class for sections that store client settings. This class abstracts the details of config system away from the LocalFileSettingsProvider. It talks to the configuration API and the relevant Sections to read and write settings. It understands sections of type ClientSettingsSection. NOTE: This API supports reading from app.exe.config and user.config, but writing only to user.config. A private configuration host that we use to write settings to config. We need this so we can enforce a quota on the size of stuff written out. ClientConfigurationHost implements this - a way of getting some info from it without depending too much on its internals. We delegate this to the ClientConfigurationHost. The only thing we need to do here is to build a configPath from the ConfigurationUserLevel we get passed in. If the stream we are asked for represents a config file that we know about, we ask the host to assert appropriate permissions. If this is a stream that represents a user.config file that we know about, we ask the host to assert appropriate permissions. The ClientSettingsStore talks to the LocalFileSettingsProvider through a dictionary which maps from setting names to StoredSetting structs. This struct contains the relevant information. Used on classes derived from ConfigurationElementCollection. Specifies the collection item type and verbs used for add/remove/clear. A config exception can contain a filename (of a config file) and a line number (of the location in the file in which a problem was encountered). Section handlers should throw this exception (or subclasses) together with filename and line number information where possible. Holds the configuration file mapping for machine.config. It is the base class for ExeConfigurationFileMap and WebConfigurationFileMap. Recursively loads configuration section groups and sections belonging to a configuration object. Indicates to the provider what default value to use for this setting when no stored value is found. The value should be encoded into a string and is interpreted based on the SerializeAs value for this setting. For example, if SerializeAs is Xml, the default value will be "stringified" Xml. Constructor takes the default value as string. Default value. The line number or 0 if no source. Not specific to a particular section, nor a global schema error Error specific to a particular section Error in the global (file) schema This interface is an extension to SettingsProvider that a provider can implement to support additional functionality for settings classes that derive from ApplicationSettingsBase. Retrieves the previous value of a given SettingsProperty. This is used in conjunction with Upgrade. Resets all settings to their "default" values. Indicates to the provider that the app has been upgraded. This is a chance for the provider to upgrade its stored settings as appropriate. The IConfigurationSectionHandler interface defines the contract that all configuration section handlers must implement in order to participate in the resolution of configuration settings. Composes and creates config objects. This interface is implemented by config providers. Classes implementing IConfigurationSectionHandler define the rules for cooking XML config into usable objects. The cooked objects can be of arbitrary type. Configuration is composable (e.g., config in a child directory is layered over config in a parent directory), so, IConfigurationSectionHandler is supplied with the parent config as well as any number of XML fragments. The function is responsible for inspecting "section", "context", and "parent", and creating a config object. Note that "parent" is guaranteed to be an object that was returned from a Create call on the same IConfigurationSectionHandler implementation. (E.g., if Create returns a Hashtable, then "parent" is always a Hashtable if it's non-null.) Returned objects must be immutable. In particular, it's important that the "parent" object being passed in is not altered: if a modification must be made, then it must be cloned before it is modified. the object inherited from parent path reserved, in ASP.NET used to convey virtual path of config being evaluated the xml node rooted at the section to handle a new config object Given a partially composed config object (possibly null) and some input from the config system, return a further partially composed config object. The IPersistComponentSettings interface enables components hosted in an application to persist their settings in a manner transparent to the application. However, in some cases, the application may want to override the provider(s) specified by a component. For example, at design time, we may want to persist settings differently. This service enables this scenario. The ApplicationSettingsBase class queries this service from the owner component's site. Queries the service whether it wants to override the provider for the given SettingsProperty. If it doesn't want to, it should return null, in which the provider will remain unchanged. This is a provider used to store configuration settings locally for client applications. Abstract SettingsProvider property. We maintain a single instance of the ClientSettingsStore per instance of provider. Abstract ProviderBase method. Abstract SettingsProvider method Abstract SettingsProvider method Implementation of IClientSettingsProvider.Reset. Resets user scoped settings to the values in app.exe.config, does nothing for app scoped settings. Implementation of IClientSettingsProvider.Upgrade. Tries to locate a previous version of the user.config file. If found, it migrates matching settings. If not, it does nothing. Implementation of IClientSettingsProvider.GetPreviousVersion. Locates the previous version of user.config, if present. The previous version is determined by walking up one directory level in the *UserConfigPath and searching for the highest version number less than the current version. Gleans information from the SettingsContext and determines the name of the config section. Retrieves the values of settings from the given config file (as opposed to using the configuration for the current context) Indicates whether a setting is roaming or not. This provider needs settings to be marked with either the UserScopedSettingAttribute or the ApplicationScopedSettingAttribute. This method determines whether this setting is user-scoped or not. It will throw if none or both of the attributes are present. Private version of upgrade that uses isRoaming to determine which config file to use. This section handler allows <appSettings file="user.config" /> The file pointed to by the file= attribute is read as if it is an appSettings section in the config file. Note: the user.config file must have its root element match the section referring to it. So if appSettings has a file="user.config" attribute the root element in user.config must also be named appSettings. Simple dictionary config factory [To be supplied.] [To be supplied.] Line number or 0 if there is no source. Use this attribute to mark properties on a settings class that are to be treated as settings. ApplicationSettingsBase will ignore all properties not marked with this or a derived attribute. Event args for the SettingChanging event. Event handler for the SettingChanging event. Description for a particular setting. Constructor takes the description string. Description string. Description for a particular settings group. Constructor takes the description string. Description string. Name of a particular settings group. Constructor takes the group name. Name of the settings group. Event args for the SettingLoaded event. Event handler for the SettingsLoaded event. Indicates the SettingsManageability for a group of/individual setting. Constructor takes a SettingsManageability enum value. SettingsManageability value to use Indicates the provider associated with a group of/individual setting. Constructor takes the provider's assembly qualified type name. Constructor takes the provider's type. Type name of the provider Event handler for the SettingsSaving event. Indicates the SettingsSerializeAs for a group of/individual setting. Constructor takes a SettingsSerializeAs enum value. SettingsSerializeAs value to use Single-tag dictionary config factory Use for tags of the form: <MySingleTag key1="value1" ... keyN="valueN"/> Create Given a partially composed config object (possibly null) and some input from the config system, return a further partially composed config object Indicates settings that are to be treated "specially". Indicates the SpecialSetting for a group of/individual settings. SpecialSetting value to use Find type references that used to be found without assembly names Indicates that a setting is to be stored on a per-user basis. Skip this element and its children, then read to next start element, or until we hit end of file. Read to the next start element, and verify that all XML nodes read are permissible. Skip this element and its children, then read to next start element, or until we hit end of file. Verify that nodes that are read after the skipped element are permissible. Skip until we hit the end element for our parent, and verify that nodes at the parent level are permissible. Add an error if the node type is not permitted by the configuration schema. Add an error if there are attributes that have not been examined, and are therefore unrecognized. Add an error if the retrieved attribute is null, and therefore not present. Verify and Retrieve the Boolean Attribute. If it is not a valid value then log an error and set the value to a given default. Format an Xml element to be written to the config file. the element start position of the element indent for each depth skip indent for the first element? Indicates that the provider should disable any logic that gets invoked when an application upgrade is detected. Helper class for getting identity hashes for types that used to live in Assembly Evidence. Gives a hash equivalent to what Url.Normalize() gives. Uses the AssemblyName's public key to generate a hash equivalent to what StrongName.Normalize() gives. Suppresses reporting of a specific rule violation, allowing multiple suppressions on a single code artifact. is different than in that it doesn't have a . So it is always preserved in the compiled assembly. Initializes a new instance of the class, specifying the category of the tool and the identifier for an analysis rule. The category for the attribute. The identifier of the analysis rule the attribute applies to. Gets the category identifying the classification of the attribute. The property describes the tool or tool analysis category for which a message suppression attribute applies. Gets the identifier of the analysis tool rule to be suppressed. Concatenated together, the and properties form a unique check identifier. Gets or sets the scope of the code that is relevant for the attribute. The Scope property is an optional argument that specifies the metadata scope for which the attribute is relevant. Gets or sets a fully qualified path that represents the target of the attribute. The property is an optional argument identifying the analysis target of the attribute. An example value is "System.IO.Stream.ctor():System.Void". Because it is fully qualified, it can be long, particularly for targets such as parameters. The analysis tool user interface should be capable of automatically formatting the parameter. Gets or sets an optional argument expanding on exclusion criteria. The property is an optional argument that specifies additional exclusion where the literal metadata target is not sufficiently precise. For example, the cannot be applied within a method, and it may be desirable to suppress a violation against a statement in the method that will give a rule violation, but not against all statements in the method. Gets or sets the justification for suppressing the code analysis message. The parameter '{0}' is invalid. The string parameter '{0}' cannot be null or empty. The value assigned to property '{0}' cannot be null or empty. The value assigned to property '{0}' is invalid. An unexpected error occurred in '{0}'. {0}: {1} An error occurred loading a configuration file An error occurred creating the configuration section handler for {0} An error occurred creating the configuration section for {0} Invalid format for a section or section group name Cannot add a ConfigurationSection that already belongs to the Configuration. Cannot add a ConfigurationSection with the same name that already exists. Cannot add a ConfigurationSection to a Configuration with a location. Cannot add a ConfigurationSectionGroup that already belongs to the Configuration. Cannot add a ConfigurationSectionGroup with the same name that already exists. Cannot add a ConfigurationSectionGroup to a Configuration with a location. It is an error to use a section registered as allowExeDefinition='MachineToApplication' beyond the application, in the user's config. (This is the default behavior if not specified) It is an error to use a section registered as allowExeDefinition='MachineOnly' beyond machine.config. It is an error to use a section registered as allowExeDefinition='MachineToRoamingUser' beyond the roaming user config, in the local user config. The configuration section 'appSettings' has an unexpected declaration. The attribute '{0}' has been locked in a higher level configuration. A collection item has been locked in a higher level configuration. The collection may not be cleared. The collection item has been locked in a higher level configuration and may not be changed. This collection does not permit items to be added in or above the inherited items. This collection does not permit items to be added in or below the inherited items. Inherited items may not be removed. Elements of this collection may not be removed. The entry '{0}' has already been added. Entry already removed. The entry '{0}' is not in the collection. The element <{0}> may only appear once in this section. The element '{0}' has been locked in a higher level configuration. Expected to find an element. The attribute '{0}' is not valid in the locked list for this section. The following attributes can be locked: {1}. Multiple attributes may be listed separated by commas. The attribute '{0}' is not valid in the locked list for this section. The following attributes can be locked: {1}. Invalid key value. The element '{0}' is not valid in the locked list for this section. The following elements can be locked: {1}. Multiple elements may be listed separated by commas. The element '{0}' is not valid in the locked list for this section. The following elements can be locked: {1}. Property '{0}' is not a ConfigurationElement. The configuration is read only. The attribute '{0}' is required and is locked at a higher level configuration. The configuration with the lock should lock the entire element if it needs to lock required attributes. The attribute '{0}' is required and cannot be locked. The configuration should lock the entire element if it needs to lock required attributes. Required attribute '{0}' not found. The configuration section cannot contain a CDATA or text element. Unrecognized attribute '{0}'. Note that attribute names are case-sensitive. Unrecognized element. Unrecognized element '{0}'. The value may not contain the '{0}' character. ConfigurationSection properties for a <section> declaration cannot be edited in a Configuration with a location. ConfigurationSection properties can not be edited for the parent section of another section (ie. a section retrieved by calling GetParentSection on a section) ConfigurationSection properties for a location section cannot be edited when allowLocation=false. ConfigurationSection properties cannot be edited when locked. ConfigurationSection cannot be edited before being added to a section group belonging to an instance of class Configuration. ConfigurationSection cannot be edited because it is a built-in section. ConfigurationSection cannot be edited because it is not declared. ConfigurationSectionGroup properties for a <sectionGroup> declaration cannot be edited in a Configuration with a location. ConfigurationSectionGroup cannot be edited before being added to a section group belonging to an instance of class Configuration. AllowOverride and InheritInChildApplications can not be set in the exe configuration, these settings have no meaning there. Unable to open configSource file '{0}'. Configuration system failed to initialize Only one <configSections> element allowed per config file and if present must be the first child of the root <configuration> element. exePath must be specified when not running inside a stand alone exe. This is not valid for the parent section of another section (ie. a section retrieved by calling GetParentSection on a section) The configuration section 'connectionStrings' has an unexpected declaration. Data read count is not equal to data available. This element is not currently associated with any context The '{0}' attribute cannot be an empty string. {1}="*" may be used to lock all attributes. The '{0}' attribute cannot be an empty string. {1}="*" may be used to lock all elements. An error occurred executing the configuration section handler for {0}. Configuration file {0} does not have root <configuration> tag The configuration file has been changed by another program. GetParentSection can only be applied to ConfigurationSections from the first instance of a Configuration. Error in configuration section "{0}": AllowLocation is false and either AllowOverride or InheritInChildApplications is true. Unable to open file '{0}' for writing because it is read-only or hidden. The property '{0}' must have value 'true' or 'false'. Invalid node type. <location> sections are allowed only within <configuration> sections. <location> path attribute must be a relative virtual path. It cannot contain any of '?' ':' '\\' '*' '"' '<' '>' or '|'. <location> path attribute must be a relative virtual path. It cannot start with any of ' ' '.' '/' or '\\'. <location> path attribute must be a relative virtual path. It cannot end with any of ' ' '.' '/' or '\\'. The '{0}' attribute must be specified on the '{1}' tag. More data than expected. The root element must match the name of the section referencing the file, '{0}' Namespace of '{0}' on configuration element is invalid, only '{1}' is valid. A configuration file cannot be created for the requested Configuration object. This configuration section cannot be encrypted. Configuration section handler returned a null object. This operation does not apply at runtime. The Configuration property '{0}' may not be derived from ConfigurationSection. Provider must implement the class '{0}'. The RootSectionGroup cannot be edited The 'allowDefinition' attribute must be one of the following values: Everywhere, MachineOnly, MachineToWebRoot, MachineToApplication. The 'allowExeDefinition' attribute must be one of the following values: MachineOnly, MachineToApplication, MachineToRoamingUser, MachineToLocalUser. This section is not allowed in <location> elements. This section has been marked allowLocation="false". This configuration section cannot be used at this path. This happens when the site administrator has locked access to this section using <location allowOverride="false"> from an inherited configuration file. Sections must only appear once per config file. See the help topic <location> for exceptions. The configSource file '{0}' can only be used by one type of section, and may not be the same as the configuration file. The configSource file '{0}' is also used in a parent, this is not allowed. The format of a configSource file must be an element containing the name of the section. The configSource attribute must be a relative physical path. The 'configSource' property may not be set in a configuration that has no associated file. A section using 'configSource' may contain no other attributes or elements. The configuration system has already been initialized. Section or group name '{0}' is already defined. Updates to this may only occur at the configuration level where it is defined. Section or group name '{0}' is already defined. This can not be defined multiple times. The section name 'location' is reserved for <location> sections. Section names beginning with config are reserved. Type '{0}' does not inherit from '{1}'. Unexpected end of element {0}. Unexpected element name {0}. expected XmlNodeType.Element, type is {0}. Unrecognized configuration section {0}. Unable to save config to file '{0}'. The expected format is an integer value in seconds. The converter cannot convert values with type '{0}'. Failed to decrypt using provider '{0}'. Error message from the provider: {1} The default value of the property '{0}' cannot be parsed. The error is: {1} The default value for the property '{0}' has different type than the one of the property itself. The data specified for decryption is bad. The '{0}' attribute cannot be an empty string. The section is marked as being protected. However, the <EncryptedData> child node was not found in the section's node. Make sure that the section is correctly encrypted. The section is marked as being protected, but it does not have the correct format. It should contain only the <EncryptedData> child node. Failed to encrypt the section '{0}' using provider '{1}'. Error message from the provider: {2} Index {0} is out of range. The enumeration value must be one of the following: {0}. The configuration section must be added to a configuration hierarchy before you can protect it. Unable to find a converter that supports conversion to/from string for the property '{0}' of type '{1}'. No information about the exception is available. A configuration property cannot have the name '{0}' because it starts with the reserved prefix 'config' or 'lock'. A configuration item alias for '{0}' cannot have the name '{1}' because it starts with the reserved prefix 'config' or 'lock'. A configuration item cannot have the name '{0}' because it starts with the reserved prefix 'config' or 'lock'. The protection provider '{0}' was not found. The value does not conform to the validation regex string '{0}'. The string cannot be null or empty. The type '{0}' must be derived from the type '{1}'. The value of the property '{0}' cannot be parsed. The error is: {1} The value of the property '{0}' cannot be converted to string. The error is: {1} The value for the property '{0}' is not valid. The error is: {1} The type '{0}' cannot be resolved. Please verify the spelling is correct or that the full type name is provided. Unable to load type '{0}' because it is not public. The configuration setting '{0}' was not recognized. The value must be different than {0}. The value must be equal to {0}. The value must be inside the range {0}-{1}. The value must not be in the range {0}-{1}. Only types derived from {0} are valid validator types. The supplied validator does not support validating the configuration element type {0}. The supplied validator does not support the type of the property '{0}'. The configuration element '{0}' is not valid. The error is: {1} The supplied method name '{0}' was not found. The callback method must be a public static void method with one object parameter. The upper range limit value must be greater than the lower range limit value. The value must have a resolution of {0}. The string cannot contain any of the following characters: '{0}'. The string must be no more than {0} characters long. The string must be at least {0} characters long. The supplied value is not of type which the validator can process. Multiple validator attributes are not currently supported. The property '{0}' has more than one validator attribute associated with it. The time span value must be positive. The type specified does not extend ProtectedConfigurationProvider class. Locking of elements or attributes within a configuration section is not supported for legacy section '{0}'. A section using 'configProtectionProvider' may contain no other attributes. The configProtectionProvider attribute cannot be an empty string. The section '{0}' is a built-in section. It cannot be declared by the user. The attribute '{0}' cannot be specified because its name starts with the reserved prefix 'config' or 'lock'. The file name '{0}' is invalid because the same file name is already referenced by the configuration hierarchy you have opened. This provider instance has already been initialized. Provider name cannot be null or empty. Collection is read-only. The configSource '{0}' is invalid. It must refer to a file in the same directory or in a subdirectory as the configuration file. The configSource attribute is invalid. InheritInChildApplications cannot be set to "false" if the location path is referring to machine.config or the root web.config. Changing both AllowOverride and OverrideMode is not supported for compatibility reasons. Please use only one or the other. The 'overrideMode' and 'overrideModeDefault' attributes must be one of the following values: Inherited, Allow, Deny. A <location> tag may contain only one of the 'allowOverride' or 'overrideMode' attributes. The machine.config file '{0}' was not found. Cannot access a closed stream. Could not find a type-converter to convert object if type '{0}' from string. Could not find a type-converter to convert object if type '{0}' to string. The property '{0}' could not be created from it's default value. Error message: {1} The property '{0}' could not be created from it's default value because the default value is of a different type. The current configuration system does not support user-scoped settings. Failed to save settings: {0} Failed to save settings: unable to access the configuration section. Unknown ConfigurationUserLevel specified. The setting {0} has both an ApplicationScopedSettingAttribute and a UserScopedSettingAttribute. The setting {0} does not have either an ApplicationScopedSettingAttribute or UserScopedSettingAttribute. The settings property '{0}' was not found. The settings property '{0}' is read-only. The settings property '{0}' is of a non-compatible type. Failed to instantiate provider: {0}. Failed to load provider type: {0}. The key '{0}' does not exist in the appSettings configuration section. The value '{0}' was found in the appSettings configuration section for key '{1}', and this value is not a valid {2}. (empty string) The '{0}' attribute must be set to an integer value. Required attribute '{0}' cannot be empty. Only elements allowed. Child nodes not allowed. Argument {0} cannot be null or zero-length. The file name '{0}' was already in the collection. Could not create listener '{0}'. Could not create {0}. Could not find type for class {0}. Could not find constructor for class {0}. switchType needs to be a valid class name. It can't be empty. The specified type, '{0}' is not derived from the appropriate base type, '{1}'. 'switchValue' and 'switchName' cannot both be specified on source '{0}'. A listener with no type name specified references the sharedListeners section and cannot have any attributes other than 'Name'. Listener: '{0}'. Listener '{0}' does not exist in the sharedListeners section. initializeData needs to be valid for this TraceListener. Attribute used to indicate a source generator should create a function for marshalling arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time. This attribute is meaningless if the source generator associated with it is not enabled. The current built-in source generator only supports C# and only supplies an implementation when applied to static, partial, non-generic methods. Initializes a new instance of the . Name of the library containing the import. Gets the name of the library containing the import. Gets or sets the name of the entry point to be called. Gets or sets how to marshal string arguments to the method. If this field is set to a value other than , must not be specified. Gets or sets the used to control how string arguments to the method are marshalled. If this field is specified, must not be specified or must be set to . Gets or sets whether the callee sets an error (SetLastError on Windows or errno on other platforms) before returning from the attributed method. Specifies how strings should be marshalled for generated p/invokes Indicates the user is suppling a specific marshaller in . Use the platform-provided UTF-8 marshaller. Use the platform-provided UTF-16 marshaller. Base type for all platform-specific API attributes. Records the platform that the project targeted. Records the operating system (and minimum version) that supports an API. Multiple attributes can be applied to indicate support on multiple operating systems. Callers can apply a or use guards to prevent calls to APIs on unsupported operating systems. A given platform should only be specified once. Marks APIs that were removed in a given operating system version. Primarily used by OS bindings to indicate APIs that are only available in earlier versions. Marks APIs that were obsoleted in a given operating system version. Primarily used by OS bindings to indicate APIs that should not be used anymore. Annotates a custom guard field, property or method with a supported platform name and optional version. Multiple attributes can be applied to indicate guard for multiple supported platforms. Callers can apply a to a field, property or method and use that field, property or method in a conditional or assert statements in order to safely call platform specific APIs. The type of the field or property should be boolean, the method return type should be boolean in order to be used as platform guard. Annotates the custom guard field, property or method with an unsupported platform name and optional version. Multiple attributes can be applied to indicate guard for multiple unsupported platforms. Callers can apply a to a field, property or method and use that field, property or method in a conditional or assert statements as a guard to safely call APIs unsupported on those platforms. The type of the field or property should be boolean, the method return type should be boolean in order to be used as platform guard.