Informations de référence sur les directives runtime (rd.xml)
Un fichier de directives runtime (.rd.xml) est un fichier de configuration XML qui spécifie si les éléments de programme désignés sont disponibles pour la réflexion. Pour plus d’informations sur la façon et l’emplacement d’ajout de directives d’exécution à votre projet et sur son reconnaissance, consultez l’utilitaire de résolution des problèmes MissingMetadataException.
Voici un exemple de fichier de directives runtime :
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Namespace Name="Contoso.Cloud.AppServices" Serialize="Required Public" />
<Namespace Name="ContosoClient.ViewModels" Serialize="Required Public" />
<Namespace Name="ContosoClient.DataModel" Serialize="Required Public" />
<Namespace Name="Contoso.Reader.UtilityLib" Serialize="Required Public" />
<Namespace Name="System.Collections.ObjectModel" >
<TypeInstantiation Name="ObservableCollection"
Arguments="ContosoClient.DataModel.ProductItem" Serialize="Public" />
<TypeInstantiation Name="ReadOnlyObservableCollection"
Arguments="ContosoClient.DataModel.ProductGroup" Serialize="Public" />
</Namespace>
</Application>
</Directives>
Structure d'un fichier de directives runtime
Le fichier de directives runtime utilise l'espace de noms http://schemas.microsoft.com/netfx/2013/01/metadata
.
L’élément racine est l’élément Directives. Il peut contenir zéro ou plusieurs éléments Library et zéro ou un élément Application, comme indiqué dans la structure suivante. Les attributs de l’élément Application peuvent définir une stratégie de réflexion runtime à l’échelle de l’application, ou peuvent servir de conteneur pour les éléments enfants. L’élément Library, quant à lui, sert simplement de conteneur. Les enfants des élémentsApplication et Library définissent les types, méthodes, champs, propriétés et événements qui sont disponibles pour la réflexion.
Pour obtenir des informations de référence, choisissez les éléments dans la structure suivante ou consultez Éléments de directive runtime. Dans la hiérarchie suivante, les points de suspension marquent une structure récursive. Les informations entre crochets indiquent si l'élément concerné est facultatif ou obligatoire, et, s'il est utilisé, le nombre d'instances autorisées (une ou plusieurs).
- Directives [1:1]
- Application [0:1]
- Assembly [0 :M]
- Espace de noms [0 :M] . . .
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Espace de noms [0 :M]
- Espace de noms [0 :M] . . .
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Type [0 :M]
- Subtypes (sous-classes du type conteneur) [O:1]
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- AttributeImplies (le type conteneur est un attribut) [O:1]
- GenericParameter [0:M]
- Méthode [0 :M]
- Parameter [0:M]
- TypeParameter [0:M]
- GenericParameter [0:M]
- MethodInstantiation (méthode générique construite) [0:M]
- Property [0:M]
- Field [0:M]
- Event [0:M]
- TypeInstantiation (type générique construit) [0 :M]
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Méthode [0 :M]
- Parameter [0:M]
- TypeParameter [0:M]
- GenericParameter [0:M]
- MethodInstantiation (méthode générique construite) [0:M]
- Property [0:M]
- Field [0:M]
- Event [0:M]
- Assembly [0 :M]
- Bibliothèque [0 :M]
- Assembly [0 :M]
- Espace de noms [0 :M] . . .
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Espace de noms [0 :M]
- Espace de noms [0 :M] . . .
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Type [0 :M]
- Subtypes (sous-classes du type conteneur) [O:1]
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- AttributeImplies (le type conteneur est un attribut) [O:1]
- GenericParameter [0:M]
- Method [0:M]
- MethodInstantiation (méthode générique construite) [0:M]
- Property [0:M]
- Field [0:M]
- Event [0:M]
- TypeInstantiation (type générique construit) [0 :M]
- Tapez [0 :M] . . .
- TypeInstantiation (type générique construit) [0 :M] . . .
- Method [0:M]
- MethodInstantiation (méthode générique construite) [0:M]
- Property [0:M]
- Field [0:M]
- Event [0:M]
- Assembly [0 :M]
- Application [0:1]
L’élément Application peut n’avoir aucun attribut, ou peut avoir les attributs de stratégie présentés dans la section Stratégie et directives runtime.
Un élément Library possède un attribut unique (Name
) qui spécifie le nom d’une bibliothèque ou d’un assembly, sans son extension de fichier. Par exemple, l’élément Library suivant s’applique à un assembly nommé Extensions.dll.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!-- Child elements go here -->
</Application>
<Library Name="Extensions">
<!-- Child elements go here -->
</Library>
</Directives>
Stratégie et directives runtime
L’élément Application lui-même et les éléments enfants des éléments Library et Application expriment la stratégie ; autrement dit, ils définissent la façon dont une application peut appliquer la réflexion à un élément de programme. Le type de stratégie est défini par un attribut de l'élément (par exemple, Serialize
). La valeur de stratégie est définie par la valeur de l’attribut (par exemple, Serialize="Required"
).
Toute stratégie spécifiée par un attribut d’un élément s’applique à tous les éléments enfants qui ne spécifient pas de valeur pour cette stratégie. Par exemple, si une stratégie est spécifiée par un élément Type, elle s’applique à tous les types et membres contenus pour lesquels une stratégie n’est pas explicitement définie.
La stratégie qui peut être exprimée par les éléments Application, Assembly, AttributeImplies, Namespace, Subtypes et Type diffère de la stratégie qui peut être exprimée pour des membres spécifiques (par les éléments Method, Property, Field, et Event).
Spécification d'une stratégie pour des assemblys, des espaces de noms et des types
Les éléments Application, Assembly, AttributeImplies, Namespace, Subtypes et Type prennent en charge les types de stratégie suivants :
Activate
. Contrôle l'accès aux constructeurs, pour permettre l'activation d'instances au moment de l'exécution.Browse
. Contrôle la demande d'informations sur les éléments de programme, mais ne permet pas l'accès au moment de l'exécution.Dynamic
. Contrôle l'accès à l'exécution à tous les membres de types, y compris les constructeurs, les méthodes, les champs, les propriétés et les événements, pour permettre la programmation dynamique.Serialize
. Contrôle l'accès au moment de l'exécution aux constructeurs, champs et propriétés, pour permettre la sérialisation des instances de types par des bibliothèques tierces comme le sérialiseur JSON Newtonsoft.DataContractSerializer
. Contrôle la stratégie pour la sérialisation qui utilise la classe System.Runtime.Serialization.DataContractSerializer.DataContractJsonSerializer
. Contrôle la stratégie pour la sérialisation JSON qui utilise la classe System.Runtime.Serialization.DataContractSerializer.XmlSerializer
. Contrôle la stratégie pour la sérialisation XML qui utilise la classe System.Xml.Serialization.XmlSerializer.MarshalObject
. Contrôle la stratégie de marshaling des types référence vers WinRT et COM.MarshalDelegate
. Contrôle la stratégie pour le marshaling des types de délégués comme pointeurs de fonction vers du code natif.MarshalStructure
. Stratégie de contrôles pour le marshaling de structures en code natif.
Les paramètres associés à ces types de stratégie sont les suivants :
All
. Activer la stratégie pour tous les types et membres que la chaîne d'outils ne supprime pas.Auto
. Utiliser le comportement par défaut. (Ne pas spécifier une stratégie équivaut à définir cette stratégie surAuto
, sauf si elle est substituée, par exemple par un élément parent.)Excluded
. Désactiver la stratégie pour l'élément de programme.Public
. Activer la stratégie pour les types ou membres publics, sauf si la chaîne d'outils détermine que le membre n'est pas nécessaire et donc le supprime. (Dans ce dernier cas, vous devez utiliserRequired Public
pour vous assurer que le membre est conservé et dispose de fonctionnalités de réflexion.)PublicAndInternal
. Activer la stratégie pour les types ou membres publics et internes si la chaîne d'outils ne les supprime pas.Required Public
. Obliger la chaîne d'outils à conserver les membres et types publics, qu'ils soient utilisés ou non, et à activer la stratégie pour eux.Required PublicAndInternal
. Obliger la chaîne d'outils à conserver les types et membres publics et internes, qu'ils soient utilisés ou non, et à activer la stratégie pour eux.Required All
. Obliger la chaîne d'outils à conserver tous les membres et types, qu'ils soient utilisés ou non, et à activer la stratégie pour eux.
Par exemple, le fichier de directives runtime suivant définit la stratégie pour tous les types et membres de l'assembly DataClasses.dll. Il autorise la réflexion pour la sérialisation de toutes les propriétés publiques, la consultation de tous les types et membres de type, l'activation pour tous les types (en raison de l'attribut Dynamic
) et la réflexion pour tous les membres et types publics.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="DataClasses" Serialize="Required Public"
Browse="All" Activate="PublicAndInternal"
Dynamic="Public" />
</Application>
<Library Name="UtilityLibrary">
<!-- Child elements go here -->
</Library>
</Directives>
Spécification d'une stratégie pour les membres
Les éléments Property et Field prennent en charge les types de stratégie suivants :
Browse
: contrôle la demande d'informations sur le membre concerné, mais ne permet pas l'accès au moment de l'exécution.Dynamic
: contrôle l'accès au moment de l'exécution à tous les membres de type, y compris aux constructeurs, méthodes, champs, propriétés et événements, pour permettre une programmation dynamique. Contrôle également les requêtes d'informations sur le type conteneur.Serialize
: contrôle l'accès au moment de l'exécution au membre pour permettre la sérialisation et la désérialisation des instances de types par des bibliothèques comme le sérialiseur JSON Newtonsoft. Cette stratégie peut être appliquée à des constructeurs, des champs et des propriétés.
Les éléments Method et Event prennent en charge les types de stratégie suivants :
Browse
- Contrôle l’interrogation d’informations sur ce membre, mais n’active aucun accès au runtime.Dynamic
: contrôle l'accès au moment de l'exécution à tous les membres de type, y compris aux constructeurs, méthodes, champs, propriétés et événements, pour permettre une programmation dynamique. Contrôle également les requêtes d'informations sur le type conteneur.
Les paramètres associés à ces types de stratégie sont les suivants :
Auto
: utiliser le comportement par défaut. (Ne pas spécifier une stratégie équivaut à définir cette stratégie surAuto
, sauf si quelque chose la substitue.)Excluded
: ne jamais inclure de métadonnées pour le membre.Included
: activer la stratégie si le type de parent est présent dans la sortie.Required
: obliger la chaîne d'outils à conserver le membre concerné même s'il semble inutilisé et à activer la stratégie pour lui.
Sémantique du fichier de directives runtime
La stratégie peut être définie simultanément pour les éléments de niveau supérieur et de niveau inférieur. Par exemple, la stratégie peut être définie pour un assembly, ainsi que pour certains des types contenus dans cet assembly. Si un élément particulier de niveau inférieur n'est pas représenté, il hérite la stratégie de son parent. Par exemple, si un élément Assembly
est présent, mais que des éléments Type
sont absents, la stratégie spécifiée dans l'élément Assembly
s'applique à chaque type dans l'assembly. Plusieurs éléments peuvent aussi appliquer la stratégie au même élément de programme. Par exemple, des éléments Assembly distincts peuvent définir le même élément de stratégie pour le même assembly différemment. Les sections suivantes expliquent comment la stratégie pour un type particulier est résolue dans ces cas.
Un élément Type ou Method d’une méthode ou type générique applique sa stratégie à toutes les instanciations qui n’ont pas leur propre stratégie. Par exemple, un élément Type
qui spécifie une stratégie pour List<T> s'applique à toutes les instances construites de ce type générique, sauf s'il est substitué pour un type générique construit particulier (comme List<Int32>
) par un élément TypeInstantiation
. Dans le cas contraire, les éléments définissent la stratégie pour l'élément de programme nommé.
Quand un élément est ambigu, le moteur recherche des correspondances, et s'il trouve une correspondance exacte, il l'utilise. La présence de plusieurs correspondances entraîne un avertissement ou une erreur.
Si deux directives appliquent la stratégie au même élément de programme
Si deux éléments dans des fichiers de directives runtime différents essaient de définir sur des valeurs différentes le même type de stratégie pour le même élément de programme (par exemple, un assembly ou un type), le conflit est résolu comme suit :
Si l'élément
Excluded
est présent, il a la priorité.Required
a la précédence sur nonRequired
.All
est prioritaire surPublicAndInternal
, lui-même prioritaire surPublic
.Tout paramètre explicite est prioritaire sur
Auto
.
Par exemple, si un projet inclut les deux fichiers de directives runtime suivants, la stratégie de sérialisation pour DataClasses.dll est définie sur Required Public
et All
. Dans ce cas, la stratégie de sérialisation est résolue en tant que Required All
.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="DataClasses" Serialize="Required Public"/>
</Application>
<Library Name="DataClasses">
<!-- any other elements -->
</Library>
</Directives>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="DataClasses" Serialize="All" />
</Application>
<Library Name="DataClasses">
<!-- any other elements -->
</Library>
</Directives>
Toutefois, si deux directives dans un même fichier de directives runtime essaient de définir le même type de stratégie pour le même élément de programme, l'outil de définition de schéma XML affiche un message d'erreur.
Si des éléments enfants et parents appliquent le même type de stratégie
Les éléments enfants se substituent à leurs éléments parents, y compris au paramètre Excluded
. La substitution est la principale raison de la spécification du paramètre Auto
.
Dans l’exemple suivant, le paramètre de stratégie de sérialisation pour tout ce qui DataClasses
n’est pas Required Public
DataClasses.ViewModels
dans ce serait , et tout ce qui se trouve dans les deux DataClasses
et DataClasses.ViewModels
serait All
.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="DataClasses" Serialize="Required Public" >
<Namespace Name="DataClasses.ViewModels" Serialize="All" />
</Assembly>
</Application>
<Library Name="DataClasses">
<!-- any other elements -->
</Library>
</Directives>
Si des génériques ouverts et des éléments instanciés appliquent le même type de stratégie
Dans l'exemple suivant, Dictionary<int,int>
ne se voit attribuer la stratégie Browse
que si le moteur a une autre raison de lui attribuer la stratégie Browse
(qui serait sinon le comportement par défaut) ; toute autre instanciation de Dictionary<TKey,TValue> permet la consultation de tous ses membres.
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<Assembly Name="DataClasses" Serialize="Required Public" >
<Namespace Name="DataClasses.ViewModels" Serialize="All" />
</Assembly>
<Namespace Name="DataClasses.Generics" />
<Type Name="Dictionary" Browse="All" />
<TypeInstantiation Name="Dictionary"
Arguments="System.Int32,System.Int32" Browse="Auto" />
</Application>
<Library Name="DataClasses">
<!-- any other elements -->
</Library>
</Directives>
Mode de déduction de la stratégie
Chaque type de stratégie possède un ensemble spécifique de règles qui déterminent la façon dont la présence de ce type de stratégie affecte les autres constructions.
Effet de la stratégie Browse
L'application de la stratégie Browse
à un type implique les modifications de stratégie suivantes :
Le type de base du type est marqué avec la stratégie
Browse
.Si le type est un générique instancié, la version non instanciée du type est marquée avec la stratégie
Browse
.Si le type est un délégué, la méthode
Invoke
sur le type est marquée avec la stratégieDynamic
.Chaque interface du type est marquée avec la stratégie
Browse
.Le type de chaque attribut appliqué au type est marqué avec la stratégie
Browse
.Si le type est générique, chaque type de contrainte est marqué avec la stratégie
Browse
.Si le type est générique, les types sur lesquels il est instancié sont marqués avec la stratégie
Browse
.
L'application de la stratégie Browse
à une méthode implique les modifications de stratégie suivantes :
Chaque type de paramètre de la méthode est marqué avec la stratégie
Browse
.Le type de retour de la méthode est marqué avec la stratégie
Browse
.Le type conteneur de la méthode est marqué avec la stratégie
Browse
.Si la méthode est une méthode générique instanciée, la méthode générique non instanciée est marquée avec la stratégie
Browse
.Le type de chaque attribut appliqué à la méthode est marqué avec la stratégie
Browse
.Si la méthode est générique, chaque type de contrainte est marqué avec la stratégie
Browse
.Si la méthode est générique, les types sur lesquels elle est instanciée sont marqués avec la stratégie
Browse
.
L'application de la stratégie Browse
à un champ implique les modifications de stratégie suivantes :
Le type de chaque attribut appliqué au champ est marqué avec la stratégie
Browse
.Le type du champ est marqué avec la stratégie
Browse
.Le type auquel appartient le champ est marqué avec la stratégie
Browse
.
Effet de la stratégie Dynamic
L'application de la stratégie Dynamic
à un type implique les modifications de stratégie suivantes :
Le type de base du type est marqué avec la stratégie
Dynamic
.Si le type est un générique instancié, la version non instanciée du type est marquée avec la stratégie
Dynamic
.Si le type est un type délégué, la méthode
Invoke
sur le type est marqué avec la stratégieDynamic
.Chaque interface du type est marquée avec la stratégie
Browse
.Le type de chaque attribut appliqué au type est marqué avec la stratégie
Browse
.Si le type est générique, chaque type de contrainte est marqué avec la stratégie
Browse
.Si le type est générique, les types sur lesquels il est instancié sont marqués avec la stratégie
Browse
.
L'application de la stratégie Dynamic
à une méthode implique les modifications de stratégie suivantes :
Chaque type de paramètre de la méthode est marqué avec la stratégie
Browse
.Le type de retour de la méthode est marqué avec la stratégie
Dynamic
.Le type conteneur de la méthode est marqué avec la stratégie
Dynamic
.Si la méthode est une méthode générique instanciée, la méthode générique non instanciée est marquée avec la stratégie
Browse
.Le type de chaque attribut appliqué à la méthode est marqué avec la stratégie
Browse
.Si la méthode est générique, chaque type de contrainte est marqué avec la stratégie
Browse
.Si la méthode est générique, les types sur lesquels elle est instanciée sont marqués avec la stratégie
Browse
.La méthode peut être appelée par
MethodInfo.Invoke
, et la création de délégué par MethodInfo.CreateDelegate devient possible.
L'application de la stratégie Dynamic
à un champ implique les modifications de stratégie suivantes :
Le type de chaque attribut appliqué au champ est marqué avec la stratégie
Browse
.Le type du champ est marqué avec la stratégie
Dynamic
.Le type auquel appartient le champ est marqué avec la stratégie
Dynamic
.
Effet de la stratégie Activation
L'application de la stratégie Activation à un type implique les modifications de stratégie suivantes :
Si le type est un générique instancié, la version non instanciée du type est marquée avec la stratégie
Browse
.Si le type est un type délégué, la méthode
Invoke
sur le type est marqué avec la stratégieDynamic
.Les constructeurs du type sont marqués avec la stratégie
Activation
.
L'application de la stratégie Activation
à une méthode implique la modification de stratégie suivante :
- Le constructeur peut être appelé par les méthodes ConstructorInfo.Invoke et Activator.CreateInstance. Pour les méthodes, la stratégie
Activation
affecte uniquement les constructeurs.
L'application de la stratégie Activation
à un champ n'a aucun effet.
Effet de la stratégie Serialize
La stratégie Serialize
permet l'utilisation de sérialiseurs courants basés sur la réflexion. Toutefois, comme les modèles d'accès à la réflexion exacts des sérialiseurs non-Microsoft ne sont pas connus de Microsoft, cette stratégie peut manquer d'efficacité.
L'application de la stratégie Serialize
à un type implique les modifications de stratégie suivantes :
Le type de base du type est marqué avec la stratégie
Serialize
.Si le type est un générique instancié, la version non instanciée du type est marquée avec la stratégie
Browse
.Si le type est un type délégué, la méthode
Invoke
sur le type est marqué avec la stratégieDynamic
.Si le type est une énumération, un tableau du type est marqué avec la stratégie
Serialize
.Si le type implémente IEnumerable<T>,
T
est marqué avec la stratégieSerialize
.Si le type est IEnumerable<T>, IList<T>, ICollection<T>, IReadOnlyCollection<T> ou IReadOnlyList<T>,
T[]
et List<T> sont marqués avec la stratégieSerialize
, mais aucun membre du type d'interface n'est marqué avec la stratégieSerialize
.Si le type est List<T>, aucun de ses membres n'est marqué avec la stratégie
Serialize
.Si le type est IDictionary<TKey,TValue>, Dictionary<TKey,TValue> est marqué avec la stratégie
Serialize
, mais aucun de ses membres n'est marqué avec la stratégieSerialize
.Si le type est Dictionary<TKey,TValue>, aucun de ses membres n'est marqué avec la stratégie
Serialize
.Si le type implémente IDictionary<TKey,TValue>,
TKey
etTValue
sont marqués avec la stratégieSerialize
.Chaque constructeur, chaque accesseur de propriété et chaque champ sont marqués avec la stratégie
Serialize
.
L'application de la stratégie Serialize
à une méthode implique les modifications de stratégie suivantes :
Le type conteneur est marqué avec la stratégie
Serialize
.Le type de retour de la méthode est marqué avec la stratégie
Serialize
.
L'application de la stratégie Serialize
à un champ implique les modifications de stratégie suivantes :
Le type conteneur est marqué avec la stratégie
Serialize
.Le type du champ est marqué avec la stratégie
Serialize
.
Effet des stratégies XmlSerializer, DataContractSerializer et DataContractJsonSerializer
Contrairement à la Serialize
stratégie, qui est destinée aux sérialiseurs basés sur la réflexion, les XmlSerializerstratégies et DataContractJsonSerializer les stratégies DataContractSerializersont utilisées pour activer un ensemble de sérialiseurs connus de la chaîne d’outils .NET Native. Ces sérialiseurs ne sont pas implémentés à l'aide de la réflexion, mais le jeu de types qui peuvent être sérialisés au moment de l'exécution est déterminé de la même manière que les types pouvant faire l'objet d'une réflexion.
Appliquer une de ces stratégies à un type permet de sérialiser celui-ci avec le sérialiseur correspondant. En outre, tous les types que le moteur de sérialisation peut déterminer de manière statique comme nécessitant une sérialisation sont également sérialisables.
Ces stratégies n'ont aucun effet sur les méthodes ou champs.
Pour plus d’informations, consultez la section « Différences entre les sérialiseurs » dans Migration de votre application du Windows Store vers .NET Native.