AssemblyName Classe

Définition

Décrit l’identité unique d’un assembly en totalité.

public ref class AssemblyName sealed
public ref class AssemblyName sealed : ICloneable, System::Runtime::Serialization::IDeserializationCallback, System::Runtime::Serialization::ISerializable
public ref class AssemblyName sealed : ICloneable, System::Runtime::InteropServices::_AssemblyName, System::Runtime::Serialization::IDeserializationCallback, System::Runtime::Serialization::ISerializable
public sealed class AssemblyName
public sealed class AssemblyName : ICloneable, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
public sealed class AssemblyName : ICloneable, System.Runtime.InteropServices._AssemblyName, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class AssemblyName : ICloneable, System.Runtime.InteropServices._AssemblyName, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
type AssemblyName = class
type AssemblyName = class
    interface ICloneable
    interface IDeserializationCallback
    interface ISerializable
type AssemblyName = class
    interface ICloneable
    interface ISerializable
    interface IDeserializationCallback
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
type AssemblyName = class
    interface _AssemblyName
    interface ICloneable
    interface ISerializable
    interface IDeserializationCallback
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type AssemblyName = class
    interface _AssemblyName
    interface ICloneable
    interface ISerializable
    interface IDeserializationCallback
Public NotInheritable Class AssemblyName
Public NotInheritable Class AssemblyName
Implements ICloneable, IDeserializationCallback, ISerializable
Public NotInheritable Class AssemblyName
Implements _AssemblyName, ICloneable, IDeserializationCallback, ISerializable
Héritage
AssemblyName
Attributs
Implémente

Exemples

Cet exemple montre comment utiliser différentes classes de réflexion pour analyser les métadonnées contenues dans un assembly.

using System;
using System.Reflection;

class Module1
{
    public static void Main()
    {
        // This variable holds the amount of indenting that
        // should be used when displaying each line of information.
        Int32 indent = 0;
        // Display information about the EXE assembly.
        Assembly a = typeof(Module1).Assembly;
        Display(indent, "Assembly identity={0}", a.FullName);
        Display(indent+1, "Codebase={0}", a.CodeBase);

        // Display the set of assemblies our assemblies reference.

        Display(indent, "Referenced assemblies:");
        foreach (AssemblyName an in a.GetReferencedAssemblies() )
        {
             Display(indent + 1, "Name={0}, Version={1}, Culture={2}, PublicKey token={3}", an.Name, an.Version, an.CultureInfo.Name, (BitConverter.ToString (an.GetPublicKeyToken())));
        }
        Display(indent, "");

        // Display information about each assembly loading into this AppDomain.
        foreach (Assembly b in AppDomain.CurrentDomain.GetAssemblies())
        {
            Display(indent, "Assembly: {0}", b);

            // Display information about each module of this assembly.
            foreach ( Module m in b.GetModules(true) )
            {
                Display(indent+1, "Module: {0}", m.Name);
            }

            // Display information about each type exported from this assembly.

            indent += 1;
            foreach ( Type t in b.GetExportedTypes() )
            {
                Display(0, "");
                Display(indent, "Type: {0}", t);

                // For each type, show its members & their custom attributes.

                indent += 1;
                foreach (MemberInfo mi in t.GetMembers() )
                {
                    Display(indent, "Member: {0}", mi.Name);
                    DisplayAttributes(indent, mi);

                    // If the member is a method, display information about its parameters.

                    if (mi.MemberType==MemberTypes.Method)
                    {
                        foreach ( ParameterInfo pi in ((MethodInfo) mi).GetParameters() )
                        {
                            Display(indent+1, "Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name);
                        }
                    }

                    // If the member is a property, display information about the property's accessor methods.
                    if (mi.MemberType==MemberTypes.Property)
                    {
                        foreach ( MethodInfo am in ((PropertyInfo) mi).GetAccessors() )
                        {
                            Display(indent+1, "Accessor method: {0}", am);
                        }
                    }
                }
                indent -= 1;
            }
            indent -= 1;
        }
    }

    // Displays the custom attributes applied to the specified member.
    public static void DisplayAttributes(Int32 indent, MemberInfo mi)
    {
        // Get the set of custom attributes; if none exist, just return.
        object[] attrs = mi.GetCustomAttributes(false);
        if (attrs.Length==0) {return;}

        // Display the custom attributes applied to this member.
        Display(indent+1, "Attributes:");
        foreach ( object o in attrs )
        {
            Display(indent+2, "{0}", o.ToString());
        }
    }

    // Display a formatted string indented by the specified amount.
    public static void Display(Int32 indent, string format, params object[] param)

    {
        Console.Write(new string(' ', indent*2));
        Console.WriteLine(format, param);
    }
}

//The output shown below is abbreviated.
//
//Assembly identity=ReflectionCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
//  Codebase=file:///C:/Documents and Settings/test/My Documents/Visual Studio 2005/Projects/Reflection/Reflection/obj/Debug/Reflection.exe
//Referenced assemblies:
//  Name=mscorlib, Version=2.0.0.0, Culture=, PublicKey token=B7-7A-5C-56-19-34-E0-89
//
//Assembly: mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//  Module: mscorlib.dll
//
//  Type: System.Object
//    Member: GetType
//    Member: ToString
//    Member: Equals
//      Parameter: Type=System.Object, Name=obj
//    Member: Equals
//      Parameter: Type=System.Object, Name=objA
//      Parameter: Type=System.Object, Name=objB
//    Member: ReferenceEquals
//      Attributes:
//        System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
//      Parameter: Type=System.Object, Name=objA
//      Parameter: Type=System.Object, Name=objB
//    Member: GetHashCode
//    Member: .ctor
//      Attributes:
//        System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
//
//  Type: System.ICloneable
//    Member: Clone
//
//  Type: System.Collections.IEnumerable
//    Member: GetEnumerator
//      Attributes:
//        System.Runtime.InteropServices.DispIdAttribute
//
//  Type: System.Collections.ICollection
//    Member: CopyTo
//      Parameter: Type=System.Array, Name=array
//      Parameter: Type=System.Int32, Name=index
//    Member: get_Count
//    Member: get_SyncRoot
//    Member: get_IsSynchronized
//    Member: Count
//      Accessor method: Int32 get_Count()
//    Member: SyncRoot
//      Accessor method: System.Object get_SyncRoot()
//    Member: IsSynchronized
//      Accessor method: Boolean get_IsSynchronized()
//
//  Type: System.Collections.IList
//    Member: get_Item
//      Parameter: Type=System.Int32, Name=index
//    Member: set_Item
//      Parameter: Type=System.Int32, Name=index
//      Parameter: Type=System.Object, Name=value
//    Member: Add
//      Parameter: Type=System.Object, Name=value
//    Member: Contains
//      Parameter: Type=System.Object, Name=value
//    Member: Clear
//    Member: get_IsReadOnly
//    Member: get_IsFixedSize
//    Member: IndexOf
//      Parameter: Type=System.Object, Name=value
//    Member: Insert
//      Parameter: Type=System.Int32, Name=index
//      Parameter: Type=System.Object, Name=value
//    Member: Remove
//      Parameter: Type=System.Object, Name=value
//    Member: RemoveAt
//      Parameter: Type=System.Int32, Name=index
//    Member: Item
//      Accessor method: System.Object get_Item(Int32)
//      Accessor method: Void set_Item(Int32, System.Object)
//    Member: IsReadOnly
//      Accessor method: Boolean get_IsReadOnly()
//    Member: IsFixedSize
//      Accessor method: Boolean get_IsFixedSize()
//
//  Type: System.Array
//    Member: IndexOf
//      Parameter: Type=T[], Name=array
//      Parameter: Type=T, Name=value
//    Member: AsReadOnly
//      Parameter: Type=T[], Name=array
//    Member: Resize
//      Attributes:
//        System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
//      Parameter: Type=T[]&, Name=array
//      Parameter: Type=System.Int32, Name=newSize
//    Member: BinarySearch
//      Attributes:
//        System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
//      Parameter: Type=T[], Name=array
//      Parameter: Type=T, Name=value
//    Member: BinarySearch
//      Attributes:
//        System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
//      Parameter: Type=T[], Name=array
//      Parameter: Type=T, Name=value
//      Parameter: Type=System.Collections.Generic.IComparer`1[T], Name=comparer
Imports System.Reflection

Module Module1
    Sub Main()
        ' This variable holds the amount of indenting that 
        ' should be used when displaying each line of information.
        Dim indent As Int32 = 0
        ' Display information about the EXE assembly.
        Dim a As Assembly = GetType(Module1).Assembly
        Display(indent, "Assembly identity={0}", a.FullName)
        Display(indent + 1, "Codebase={0}", a.CodeBase)

        ' Display the set of assemblies our assemblies reference.
        Dim an As AssemblyName
        Display(indent, "Referenced assemblies:")
        For Each an In a.GetReferencedAssemblies()
            Display(indent + 1, "Name={0}, Version={1}, Culture={2}, PublicKey token={3}", _
                an.Name, an.Version, an.CultureInfo.Name, BitConverter.ToString(an.GetPublicKeyToken))
        Next
        Display(indent, "")

        ' Display information about each assembly loading into this AppDomain.
        For Each a In AppDomain.CurrentDomain.GetAssemblies()
            Display(indent, "Assembly: {0}", a)

            ' Display information about each module of this assembly.
            Dim m As [Module]
            For Each m In a.GetModules(True)
                Display(indent + 1, "Module: {0}", m.Name)
            Next

            ' Display information about each type exported from this assembly.
            Dim t As Type
            indent += 1
            For Each t In a.GetExportedTypes()
                Display(0, "")
                Display(indent, "Type: {0}", t)

                ' For each type, show its members & their custom attributes.
                Dim mi As MemberInfo
                indent += 1
                For Each mi In t.GetMembers()
                    Display(indent, "Member: {0}", mi.Name)
                    DisplayAttributes(indent, mi)

                    ' If the member is a method, display information about its parameters.
                    Dim pi As ParameterInfo
                    If mi.MemberType = MemberTypes.Method Then
                        For Each pi In CType(mi, MethodInfo).GetParameters()
                            Display(indent + 1, "Parameter: Type={0}, Name={1}", pi.ParameterType, pi.Name)
                        Next
                    End If

                    ' If the member is a property, display information about the property's accessor methods.
                    If mi.MemberType = MemberTypes.Property Then
                        Dim am As MethodInfo
                        For Each am In CType(mi, PropertyInfo).GetAccessors()
                            Display(indent + 1, "Accessor method: {0}", am)
                        Next
                    End If
                Next
                indent -= 1
            Next
            indent -= 1
        Next
    End Sub

    ' Displays the custom attributes applied to the specified member.
    Sub DisplayAttributes(ByVal indent As Int32, ByVal mi As MemberInfo)
        ' Get the set of custom attributes; if none exist, just return.
        Dim attrs() As Object = mi.GetCustomAttributes(False)
        If attrs.Length = 0 Then Return

        ' Display the custom attributes applied to this member.
        Display(indent + 1, "Attributes:")
        Dim o As Object
        For Each o In attrs
            Display(indent + 2, "{0}", o.ToString())
        Next
    End Sub

    ' Display a formatted string indented by the specified amount.
    Sub Display(ByVal indent As Int32, ByVal format As String, ByVal ParamArray params() As Object)
        Console.Write(New String(" "c, indent * 2))
        Console.WriteLine(format, params)
    End Sub
End Module

'The output shown below is abbreviated.
'
'Assembly identity=Reflection, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
'  Codebase=file:///C:/Reflection.exe
'Referenced assemblies:
'  Name=mscorlib, Version=1.0.5000.0, Culture=, PublicKey token=B7-7A-5C-56-19-34-E0-89
'  Name=Microsoft.VisualBasic, Version=7.0.5000.0, Culture=, PublicKey token=B0-3F-5F-7F-11-D5-0A-3A
'
'Assembly: mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
'  Module: mscorlib.dll
'  Module: prc.nlp
'  Module: prcp.nlp
'  Module: ksc.nlp
'  Module: ctype.nlp
'  Module: xjis.nlp
'  Module: bopomofo.nlp
'  Module: culture.nlp
'  Module: region.nlp
'  Module: sortkey.nlp
'  Module: charinfo.nlp
'  Module: big5.nlp
'  Module: sorttbls.nlp
'  Module: l_intl.nlp
'  Module: l_except.nlp
'
'  Type: System.Object
'    Member: GetHashCode
'    Member: Equals
'      Parameter: Type=System.Object, Name=obj
'    Member: ToString
'    Member: Equals
'      Parameter: Type=System.Object, Name=objA
'      Parameter: Type=System.Object, Name=objB
'    Member: ReferenceEquals
'      Parameter: Type=System.Object, Name=objA
'      Parameter: Type=System.Object, Name=objB
'    Member: GetType
'    Member: .ctor
'
'  Type: System.ICloneable
'    Member: Clone
'
'  Type: System.Collections.IEnumerable
'    Member: GetEnumerator
'      Attributes:
'        System.Runtime.InteropServices.DispIdAttribute
'
'  Type: System.Collections.ICollection
'    Member: get_IsSynchronized
'    Member: get_SyncRoot
'    Member: get_Count
'    Member: CopyTo
'      Parameter: Type=System.Array, Name=array
'      Parameter: Type=System.Int32, Name=index
'    Member: Count
'      Accessor method: Int32 get_Count()
'    Member: SyncRoot
'      Accessor method: System.Object get_SyncRoot()
'    Member: IsSynchronized
'      Accessor method: Boolean get_IsSynchronized()
'

Remarques

L’objet AssemblyName contient des informations sur un assembly, que vous pouvez utiliser pour établir une liaison à cet assembly. L’identité d’un assembly se compose des éléments suivants :

  • Nom simple.
  • Numéro de version.
  • Paire de clés de chiffrement.
  • Culture prise en charge.

Le nom simple est généralement le nom de fichier du fichier manifeste sans son extension. La paire de clés inclut une clé publique et privée, utilisée pour créer des signatures de nom fort pour les assemblys.

Tous les compilateurs qui prennent en charge le Common Language Runtime émettent le nom simple d’une classe imbriquée et la réflexion construit un nom bascule lorsqu’ils sont interrogés, conformément aux conventions suivantes.

Délimiteur Signification
Barre oblique inverse (\) Caractère d’échappement.
Virgule (,) Précède le nom de l’assembly.
Signe plus (+) Précède une classe imbriquée.

Par exemple, le nom complet d’une classe peut ressembler à ceci :

ContenantClass+NestedClass,MyAssembly

Un « ++ » devient « \+\+ », et un « \ » devient « \\ ».

Ce nom qualifié peut être conservé et utilisé ultérieurement pour charger le Typefichier . Pour rechercher et charger un Type, utilisez GetType uniquement le nom de type ou le nom de type qualifié d’assembly. GetType avec le nom de type uniquement recherche l’assembly Type de l’appelant, puis dans l’assembly système. GetType avec le nom de type qualifié d’assembly recherche le Type dans n’importe quel assembly.

Un nom, la culture, la clé publique ou le jeton de clé publique, la version principale, la version mineure, le numéro de build et les paramètres de numéro de révision doivent être spécifiés AssemblyName . Les quatre derniers sont empaquetés dans le Version type.

Pour créer un nom simple, créez un AssemblyName objet à l’aide du constructeur sans paramètre et définissez le Name. Les autres propriétés sont facultatives.

Pour créer un nom fort complet, créez un AssemblyName objet à l’aide du constructeur sans paramètre et définissez l’objet Name et KeyPair. Les autres propriétés sont facultatives. Utilisez et SetPublicKeyToken définissez SetPublicKey la clé publique et le nom fort. La signature de nom fort utilise toujours l’algorithme de SHA1 hachage.

Pour vous assurer que les noms sont correctement construits, utilisez les propriétés suivantes :

Vous pouvez également obtenir le nom à l’aide de l’option /l avec l' Gacutil.exe (Outil Global Assembly Cache).

Pour un nom fort partiellement spécifié, créez un AssemblyName objet à l’aide du constructeur sans paramètre et définissez le nom et la clé publique. Un assembly créé à l’aide d’un AssemblyName tel assembly peut être signé ultérieurement à l’aide de l’Assembly Linker (Al.exe).

Il est possible de spécifier une clé publique et une KeyPair valeur incohérente. Cela peut être utile dans les scénarios de développement. Dans ce cas, la clé publique récupérée avec GetPublicKey la clé publique correcte, tandis que les clés publiques et privées utilisées pendant le KeyPair développement sont spécifiées. Lorsque le runtime détecte une incompatibilité entre la clé publique et la KeyPair clé publique, il recherche dans le Registre la clé correcte qui correspond à la clé publique.

Le format du nom complet d’une AssemblyName chaîne Unicode délimitée par des virgules commence par le nom, comme suit :

Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'

Name est le nom textuel de l’assembly. CultureInfo est la culture définie par RFC1766 format. Major, , MinorBuildet Revision sont la version principale, la version mineure, le numéro de build et le numéro de révision de l’assembly. StrongName est la valeur de hachage hexadécimale de 64 bits de la valeur de hachage générée à l’aide de l’algorithme de hachage SHA-1 et de la clé publique spécifiée par SetPublicKey. PublicKeyToken est la clé publique hexadécimale spécifiée par SetPublicKey.

L’encodage hexadécimal est défini comme la conversion de chaque octet d’un objet binaire en deux caractères hexadécimaux, en passant du moins au octet le plus significatif. Des valeurs d’affichage supplémentaires seront ajoutées comme nécessaire.

Si la clé publique complète est connue, PublicKey peut être remplacée par StrongName.

Notez également que, à l’exception Namede , qui doit venir en premier, l’ordre lexical des paramètres n’est pas important. Toutefois, tout paramètre (Version, CultureStrongName ou PublicKey) non défini spécifiquement est considéré comme omis, et il AssemblyName est ensuite considéré comme partiel. Lors de la spécification d’informations partielles, les paramètres Name doivent être spécifiés dans l’ordre décrit ci-dessus.

Lorsque vous fournissez un nom d’affichage, la convention StrongName =null ou PublicKey= null indique que la liaison et la correspondance avec un assembly simplement nommé sont requises. En outre, la convention Culture= "" (guillemet double représentant une chaîne vide) indique la correspondance avec la culture par défaut.

L’exemple suivant montre un AssemblyName assembly simplement nommé avec la culture par défaut.

ExampleAssembly, Culture=""

L’exemple suivant illustre une référence complète pour un assembly utilisant un nom fort et la culture « en ».

ExampleAssembly, Version=1.0.0.0, Culture=en, PublicKeyToken=a5d015c7d5a0b012

Constructeurs

Nom Description
AssemblyName()

Initialise une nouvelle instance de la classe AssemblyName.

AssemblyName(String)

Initialise une nouvelle instance de la AssemblyName classe avec le nom complet spécifié.

Propriétés

Nom Description
CodeBase
Obsolète.

Obtient ou définit l’emplacement de l’assembly en tant qu’URL.

ContentType

Obtient ou définit une valeur qui indique le type de contenu que contient l’assembly.

CultureInfo

Obtient ou définit la culture prise en charge par l’assembly.

CultureName

Obtient ou définit le nom de la culture associée à l’assembly.

EscapedCodeBase
Obsolète.

Obtient l’URI, y compris les caractères d’échappement, qui représente la base de code.

Flags

Obtient ou définit les attributs de l’assembly.

FullName

Obtient le nom complet de l’assembly, également appelé nom d’affichage.

HashAlgorithm
Obsolète.

Obtient ou définit l’algorithme de hachage utilisé par le manifeste d’assembly.

KeyPair
Obsolète.

Obtient ou définit la paire de clés de chiffrement publique et privée utilisée pour créer une signature de nom fort pour l’assembly.

Name

Obtient ou définit le nom simple de l’assembly. Il s’agit généralement, mais pas nécessairement, du nom de fichier du fichier manifeste de l’assembly, moins son extension.

ProcessorArchitecture
Obsolète.

Obtient ou définit une valeur qui identifie le processeur et les bits par mot de la plateforme ciblée par un exécutable.

Version

Obtient ou définit les numéros principaux, mineurs, de build et de révision de l’assembly.

VersionCompatibility
Obsolète.

Obtient ou définit les informations relatives à la compatibilité de l’assembly avec d’autres assemblys.

Méthodes

Nom Description
Clone()

Effectue une copie de cet AssemblyName objet.

Equals(Object)

Détermine si l’objet spécifié est égal à l’objet actuel.

(Hérité de Object)
GetAssemblyName(String)

Obtient le AssemblyName fichier donné.

GetHashCode()

Sert de fonction de hachage par défaut.

(Hérité de Object)
GetObjectData(SerializationInfo, StreamingContext)
Obsolète.

Obtient des informations de sérialisation avec toutes les données nécessaires pour recréer une instance de ce AssemblyName.

GetPublicKey()

Obtient la clé publique de l’assembly.

GetPublicKeyToken()

Obtient le jeton de clé publique, qui est le dernier 8 octets du hachage SHA-1 de la clé publique sous laquelle l’application ou l’assembly est signé.

GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
OnDeserialization(Object)

Implémente l’interface ISerializable et est rappelée par l’événement de désérialisation lorsque la désérialisation est terminée.

ReferenceMatchesDefinition(AssemblyName, AssemblyName)

Retourne une valeur indiquant si deux noms d’assembly sont identiques. La comparaison est basée sur les noms d’assembly simples.

SetPublicKey(Byte[])

Définit la clé publique identifiant l’assembly.

SetPublicKeyToken(Byte[])

Définit le jeton de clé publique, qui est le dernier 8 octets du hachage SHA-1 de la clé publique sous laquelle l’application ou l’assembly est signé.

ToString()

Retourne le nom complet de l’assembly, également appelé nom d’affichage.

Implémentations d’interfaces explicites

Nom Description
_AssemblyName.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch.

_AssemblyName.GetTypeInfo(UInt32, UInt32, IntPtr)

Récupère les informations de type pour un objet, qui peuvent être utilisées ensuite pour obtenir les informations de type d'une interface.

_AssemblyName.GetTypeInfoCount(UInt32)

Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1).

_AssemblyName.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fournit l’accès aux propriétés et méthodes exposées par un objet.

S’applique à

Voir aussi