Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.
Utilisez la GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) surcharge de méthode et ses surcharges associées (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) et GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) pour remplacer l’implémentation par défaut de la GetType méthode par des implémentations plus flexibles. En fournissant vos propres méthodes qui résolvent les noms de type et les noms des assemblys qui les contiennent, vous pouvez effectuer les opérations suivantes :
- Contrôlez la version d’un assembly à partir de laquelle un type est chargé.
- Fournissez un emplacement supplémentaire pour rechercher un nom de type qui n'inclut pas de nom d'assemblage.
- Chargez des assemblies à l’aide de noms partiels d’assembly.
- Retourne les sous-classes de System.Type celles qui ne sont pas créées par le Common Language Runtime (CLR).
Par exemple, dans la sérialisation à tolérance de version, cette méthode vous permet de rechercher un assembly « meilleur ajustement » à l’aide d’un nom partiel. D'autres surcharges de la méthode GetType nécessitent un nom de type qualifié d'assembly, qui inclut le numéro de version.
D’autres implémentations du système de type peuvent avoir besoin de retourner des sous-classes de System.Type qui ne sont pas créées par le CLR ; tous les types retournés par d'autres surcharges de la méthode GetType sont des types au moment de l'exécution.
Notes d’utilisation
Cette surcharge de méthode et ses surcharges associées analysent typeName
dans le nom d’un type et le nom d’un assembly, puis résolvent les noms. La résolution du nom de l'assemblage se produit avant la résolution du nom de type, car un nom de type doit être résolu dans le contexte d'un assemblage.
Remarque
Si vous ne connaissez pas le concept de noms de types qualifiés d'assembly, consultez la propriété AssemblyQualifiedName.
Si typeName
n'est pas un nom qualifié d'assembly, la résolution de l'assembly est ignorée. Les noms de types non qualifiés peuvent être résolus dans le contexte de mscorlib.dll/System.Private.CoreLib.dll ou de l'assembly en cours d'exécution, ou vous pouvez éventuellement fournir un assembly dans le paramètre typeResolver
. Les effets de l’inclusion ou de l’omission du nom d’assembly pour différents types de résolution de noms sont affichés sous forme de tableau dans la section Résolution de noms mixte .
Notes d’utilisation générales :
Ne transmettez pas de méthodes à
assemblyResolver
outypeResolver
s’ils proviennent d’appelants inconnus ou non approuvés. Utilisez uniquement les méthodes que vous fournissez ou que vous connaissez bien.Avertissement
L’utilisation de méthodes provenant d’appelants inconnus ou non approuvés peut entraîner une élévation de privilèges pour le code malveillant.
Si vous omettez le paramètre
assemblyResolver
et/ou le paramètretypeResolver
, la valeur du paramètrethrowOnError
est transmise aux méthodes qui effectuent la résolution par défaut.Si
throwOnError
esttrue
, cette méthode lève une TypeLoadException quandtypeResolver
retournenull
, et une FileNotFoundException quandassemblyResolver
retournenull
.Cette méthode n’intercepte pas les exceptions levées par
assemblyResolver
ettypeResolver
. Vous êtes responsable des exceptions générées par les méthodes de résolution.
Résolution des assemblys
La assemblyResolver
méthode reçoit un AssemblyName objet, qui est produit en analysant le nom de l’assembly de chaîne inclus dans typeName
. S’il typeName
ne contient pas de nom d’assembly, assemblyResolver
n’est pas appelé et null
est passé à typeResolver
.
Si assemblyResolver
n’est pas fourni, la recherche d'assemblage standard est utilisée pour localiser l'assemblage. Si assemblyResolver
est fourni, la méthode GetType n’effectue pas de sondage standard ; dans ce cas, vous devez vous assurer que votre assemblyResolver
peut gérer tous les assemblages que vous lui transmettez.
La assemblyResolver
méthode doit retourner null
si l’assembly ne peut pas être résolu. Si assemblyResolver
retourne null
, typeResolver
n’est pas appelé et aucun traitement supplémentaire ne se produit ; en outre, si throwOnError
est true
, un FileNotFoundException est levé.
Si le AssemblyName qui est passé à assemblyResolver
est un nom partiel, une ou plusieurs de ses parties sont null
. Par exemple, s’il n’a pas de version, la Version propriété est null
. Si la Version propriété, la CultureInfo propriété et la GetPublicKeyToken méthode retournent null
tous, seul le nom simple de l’assembly a été fourni. La assemblyResolver
méthode peut utiliser ou ignorer toutes les parties du nom de l’assembly.
Les effets des différentes options de résolution d'assembly sont indiqués dans le tableau de la section Résolutions de noms mixtes, pour les noms de types simples et les noms de types qualifiés d'assembly.
Résolution des types
Si aucun nom d'assembly n'est spécifié pour typeName
, typeResolver
est toujours appelé. Si typeName
spécifie un nom d’assembly, typeResolver
est appelée uniquement lorsque le nom d’assembly est résolu avec succès. Si assemblyResolver
ou le sondage d’assembly standard retourne null
, typeResolver
n’est pas appelé.
La typeResolver
méthode reçoit trois arguments :
- L'assembly à rechercher ou
null
sitypeName
ne contient pas de nom d'assembly. - Le nom simple du type. Dans le cas d’un type imbriqué, il s’agit du type contenant le plus externe. Dans le cas d’un type générique, il s’agit du nom simple du type générique.
- Valeur booléenne qui est
true
si le cas des noms de types doit être ignoré.
L’implémentation détermine la façon dont ces arguments sont utilisés. La typeResolver
méthode doit retourner null
si elle ne peut pas résoudre le type. Si typeResolver
renvoie null
et que throwOnError
est true
, cette surcharge de GetType lève une TypeLoadException.
Les effets des différents types de résolution d'assembly sont indiqués dans le tableau de la section Résolutions de noms mixtes, pour les noms de types simples et les noms de types qualifiés d'assembly.
Résolution des types imbriqués
Si typeName
est un type imbriqué, seul le nom du type conteneur le plus extérieur est passé à typeResolver
. Lorsqu'une méthode de type typeResolver
retourne ce type, la méthode GetNestedType est appelée de manière récursive jusqu’à ce que le type imbriqué le plus interne ait été résolu.
Résolution des types génériques
Il GetType est appelé de manière récursive pour résoudre les types génériques : commencez par résoudre le type générique lui-même, puis pour résoudre ses arguments de type. Si un argument de type est générique, GetType est appelé de manière récursive pour résoudre ses arguments de type, et ainsi de suite.
La combinaison de assemblyResolver
et typeResolver
que vous fournissez doit être capable de résoudre tous les niveaux de cette récursivité. Par exemple, supposons que vous fournissez un assemblyResolver
qui contrôle le chargement de MyAssembly
. Supposons que vous souhaitez résoudre le type Dictionary<string, MyType>
générique (Dictionary(Of String, MyType)
en Visual Basic). Vous pouvez passer le nom de type générique suivant :
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Notez que MyType
est le seul argument de type qualifié par assembly. Les noms des classes Dictionary<TKey,TValue> et String ne sont pas qualifiés par l’assembly. Votre typeResolver
doit être capable de gérer un assemblage ou null
, car il recevra null
pour Dictionary<TKey,TValue> et String. Il peut gérer ce cas en appelant une surcharge de la méthode GetType qui prend une chaîne, car les deux noms de types non qualifiés se trouvent dans mscorlib.dll/System.Private.CoreLib.dll :
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
La méthode assemblyResolver
n’est pas appelée pour le type de dictionnaire et le type de chaîne, car ces noms de types ne sont pas qualifiés par l’assembly.
Supposons maintenant que, au lieu de , le premier type d’argument System.String
générique est YourType
, à partir de YourAssembly
:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Étant donné que cet assembly n’est ni mscorlib.dll/System.Private.CoreLib.dll ni l’assembly en cours d’exécution, vous ne pouvez pas résoudre YourType
sans nom qualifié d'assembly. Étant donné que votre assemblyResolve
sera appelé de manière récursive, il doit être en mesure de gérer ce cas. Au lieu de retourner null
pour des assemblies autres que MyAssembly
, il effectue désormais un chargement d'assemblies à l'aide de l'objet AssemblyName fourni.
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
Résoudre les noms de types avec des caractères spéciaux
Certains caractères ont des significations spéciales dans les noms qualifiés d'assembly .NET. Si un nom de type simple contient ces caractères, les caractères provoquent des erreurs d’analyse lorsque le nom simple fait partie d’un nom qualifié d’assembly. Pour éviter les erreurs d’analyse, vous devez échapper les caractères spéciaux avec une barre oblique inverse avant de pouvoir passer le nom qualifié d’assembly à la méthode GetType. Par exemple, si un type est nommé Strange]Type
, le caractère d’échappement doit être ajouté devant le crochet comme suit : Strange\]Type
.
Remarque
Les noms avec ces caractères spéciaux ne peuvent pas être créés en Visual Basic ou C#, mais peuvent être créés à l’aide du langage intermédiaire commun (CIL) ou en émettant des assemblys dynamiques.
Le tableau suivant présente les caractères spéciaux pour les noms de types.
Caractère | Sens |
---|---|
, (virgule) |
Délimiteur pour les noms qualifiés d’assembly. |
[] (crochets) |
En tant que paire de suffixes, indique un type de tableau ; en tant que paire de délimiteurs, encadre les listes d’arguments génériques et les noms qualifiés d'assembly. |
& (esperluette) |
En tant que suffixe, indique qu’un type est un type de référence. |
* (astérisque) |
En tant que suffixe, indique qu’un type est un type de pointeur. |
+ (plus) |
Délimiteur pour les types imbriqués. |
\ (barre oblique inverse) |
Caractère d’échappement. |
Les propriétés telles que AssemblyQualifiedName renvoient des chaînes correctement échappées. Vous devez passer des chaînes échappées correctement à la méthode GetType. À son tour, la méthode GetType transmet les noms correctement échappés aux méthodes typeResolver
et aux méthodes de résolution de type par défaut. Si vous devez comparer un nom à un nom non échappé dans typeResolver
, vous devez supprimer les caractères d'échappement.
Résolutions de noms mixtes
Le tableau suivant récapitule les interactions entre assemblyResolver
, typeResolver
et la résolution de noms par défaut, pour toutes les combinaisons de noms de type et de nom d’assembly dans typeName
:
Contenu du nom de type | Méthode du résolveur d'assembly | Méthode du résolveur de type | Résultat |
---|---|---|---|
type, assemblage | zéro | zéro | Équivaut à appeler la surcharge de méthode Type.GetType(String, Boolean, Boolean) . |
type, assemblage | pourvu que | zéro |
assemblyResolver retourne l’assemblage ou retourne null s’il ne peut pas résoudre l’assemblage. Si l’assembly est résolu, la surcharge de méthode Assembly.GetType(String, Boolean, Boolean) est utilisée pour charger le type à partir de l’assembly ; sinon, il n'y a aucune tentative de résolution du type. |
type, assemblage | zéro | pourvu que | Équivaut à convertir le nom de l'assembly en un objet AssemblyName et à appeler la surcharge de méthode Assembly.Load(AssemblyName) pour obtenir l'assembly. Si l’assembly est résolu, il est passé à typeResolver ; sinon, typeResolver n’est pas appelé et il n’y a pas d’autre tentative de résolution du type. |
type, assemblage | pourvu que | pourvu que |
assemblyResolver retourne l’assemblage ou retourne null s’il ne peut pas résoudre l’assemblage. Si l’assembly est résolu, il est passé à typeResolver ; sinon, typeResolver n’est pas appelé et il n’y a pas d’autre tentative de résolution du type. |
type | null, fourni | zéro | Équivaut à appeler la surcharge de méthode Type.GetType(String, Boolean, Boolean) . Étant donné que le nom de l’assembly n’est pas fourni, seuls mscorlib.dll/System.Private.CoreLib.dll et l’assembly en cours d’exécution sont recherchés. Si assemblyResolver est fourni, il est ignoré. |
type | null, fourni | pourvu que |
typeResolver est appelé et null est passé pour l’assemblage.
typeResolver peut fournir un type à partir de n’importe quel assembly, y compris les assemblys qu’il charge à cette fin. Si assemblyResolver est fourni, il est ignoré. |
assemblée | null, fourni | null, fourni | Une FileLoadException, est levée, car le nom de l'assembly est analysé comme s'il s'agissait d'un nom de type qualifié d'assembly. Cela entraîne un nom d’assembly non valide. |