Runtime Directive Policy Settings
Runtime directive policy settings for .NET Native determine the availability of metadata for types and type members at run time. Without the necessary metadata, operations that rely on reflection, serialization and deserialization, or marshaling of .NET Framework types to COM or the Windows Runtime can fail and throw an exception. Most common exceptions are MissingMetadataException and (in the case of interop) MissingInteropDataException.
Runtime policy settings are controlled by a runtime directives (.rd.xml) file. Each runtime directive defines policy for a particular program element, such as an assembly (the <Assembly> element), a type (the <Type> element), or a method (the <Method> element). The directive includes one or more attributes that define the reflection policy types, the serialization policy types, and the interop policy types discussed in the next section. The value of the attribute defines the policy setting.
Policy types
Runtime directives files recognize three categories of policy types: reflection, serialization, and interop.
Reflection policy types determine which metadata is made available at run time for reflection:
Activate
controls runtime access to constructors, to enable activation of instances.Browse
controls querying for information about program elements.Dynamic
controls runtime access to all types and members to enable dynamic programming.
The following table lists the reflection policy types and the program elements with which they can be used.
Element Activate Browse Dynamic <Application> ✔️ ✔️ ✔️ <Assembly> ✔️ ✔️ ✔️ <AttributeImplies> ✔️ ✔️ ✔️ <Event> ✔️ ✔️ <Field> ✔️ ✔️ <GenericParameter> ✔️ ✔️ ✔️ <ImpliesType> ✔️ ✔️ ✔️ <Method> ✔️ ✔️ <MethodInstantiation> ✔️ ✔️ <Namespace> ✔️ ✔️ ✔️ <Parameter> ✔️ ✔️ ✔️ <Property> ✔️ ✔️ <Subtypes> ✔️ ✔️ ✔️ <Type> ✔️ ✔️ ✔️ <TypeInstantiation> ✔️ ✔️ ✔️ <TypeParameter> ✔️ ✔️ ✔️ Serialization policy types determine which metadata is made available at run time for serialization and deserialization:
Serialize
controls runtime access to constructors, fields, and properties, to enable type instances to be serialized by third-party libraries such as the Newtonsoft JSON serializer.DataContractSerializer
controls runtime access to constructors, fields, and properties, to enable type instances to be serialized by the DataContractSerializer class.DataContractJsonSerializer
controls runtime access to constructors, fields, and properties, to enable type instances to be serialized by the DataContractJsonSerializer class.XmlSerializer
controls runtime access to constructors, fields, and properties, to enable type instances to be serialized by the XmlSerializer class.
The following table lists the serialization policy types and the program elements with which they can be used.
Element Serialize DataContractSerializer DataContractJsonSerializer XmlSerializer <Application> ✔️ ✔️ ✔️ ✔️ <Assembly> ✔️ ✔️ ✔️ ✔️ <AttributeImplies> ✔️ ✔️ ✔️ ✔️ <Event> <Field> ✔️ <GenericParameter> ✔️ ✔️ ✔️ ✔️ <ImpliesType> ✔️ ✔️ ✔️ ✔️ <Method> <MethodInstantiation> <Namespace> ✔️ ✔️ ✔️ ✔️ <Parameter> ✔️ ✔️ ✔️ ✔️ <Property> ✔️ <Subtypes> ✔️ ✔️ ✔️ ✔️ <Type> ✔️ ✔️ ✔️ ✔️ <TypeInstantiation> ✔️ ✔️ ✔️ ✔️ <TypeParameter> ✔️ ✔️ ✔️ ✔️ Interop policy types determine which metadata is made available at run time to pass references types, value types, and function pointers to COM and the Windows Runtime:
MarshalObject
controls native marshaling to COM and the Windows Runtime for reference types.MarshalDelegate
controls native marshaling of delegate types as function pointers.MarshalStructure
controls native marshaling to COM and the Windows Runtime for value types.
The following table lists the interop policy types and the program elements with which they can be used.
Element MarshalObject MarshalDelegate MarshalStructure <Application> ✔️ ✔️ ✔️ <Assembly> ✔️ ✔️ ✔️ <AttributeImplies> ✔️ ✔️ ✔️ <Event> <Field> <GenericParameter> ✔️ ✔️ ✔️ <ImpliesType> ✔️ ✔️ ✔️ <Method> <MethodInstantiation> <Namespace> ✔️ ✔️ ✔️ <Parameter> ✔️ ✔️ ✔️ <Property> <Subtypes> ✔️ ✔️ ✔️ <Type> ✔️ ✔️ ✔️ <TypeInstantiation> ✔️ ✔️ ✔️ <TypeParameter> ✔️ ✔️ ✔️
Policy settings
Each policy type can be set to one of the values listed in the following table. Note that elements that represent type members support a different set of policy settings than other elements.
Policy setting | Description | Assembly , Namespace , Type , and TypeInstantiation elements |
Event , Field , Method , MethodInstantiation , and Property elements |
---|---|---|---|
All |
Enables the policy for all types and members that the .NET Native tool chain doesn't remove. | ✔️ | |
Auto |
Specifies that the default policy should be used for the policy type for that program element. This is identical to omitting a policy for that policy type. Auto is typically used to indicate that policy is inherited from a parent element. |
✔️ | ✔️ |
Excluded |
Specifies that the policy is disabled for a particular program element. For example, the runtime directive:<Type Name="BusinessClasses.Person" Browse="Excluded" Dynamic="Excluded" /> specifies that metadata for the BusinessClasses.Person class isn't available either to browse or to dynamically instantiate and modify Person objects. |
✔️ | ✔️ |
Included |
Enables a policy if metadata for the parent type is available. | ✔️ | |
Public |
Enables the policy for public types or members, unless the tool chain determines that the type or member is unnecessary and therefore removes it. This setting differs from Required Public , which ensures that metadata for public types and members is always available even if the tool chain determines that it's unnecessary. |
✔️ | |
PublicAndInternal |
Enables the policy for public and internal types or members, unless the tool chain determines that the type or member is unnecessary and therefore removes it. This setting differs from Required PublicAndInternal , which ensures that metadata for public and internal types and members is always available even if the tool chain determines that it's unnecessary. |
✔️ | |
Required |
Specifies that the policy for a member is enabled and that metadata will be available even if the member appears to be used. | ✔️ | |
Required Public |
Enables the policy for public types or members, and ensures that metadata for public types and members is always available. This setting differs from Public , which makes metadata for public types and members available only if the tool chain determines that it's necessary. |
✔️ | |
Required PublicAndInternal |
Enables the policy for public and internal types or members, and ensures that metadata for public and internal types and members is always available. This setting differs from PublicAndInternal , which makes metadata for public and internal types and members available only if the tool chain determines that it's necessary. |
✔️ | |
Required All |
Requires the tool chain to keep all types and members whether or not they're used, and enables policy for them. | ✔️ |