Assemblys friend (C# et Visual Basic)

Un assembly friend peut accéder aux types et membres friend (Visual Basic) ou internal (C#) d'un autre assembly. Si vous identifiez un assembly en tant qu'assembly friend, les types et les membres n'ont pas besoin d'être publics pour accéder à d'autres assemblys. Cette solution est particulièrement pratique dans les cas suivants :

  • Pendant les tests unitaires, lorsque le code de test s'exécute dans un assembly séparé, mais requiert l'accès aux membres de l'assembly en cours de test qui sont marqués comme Friend (Visual Basic) ou internal (C#).

  • Lorsque vous développez une bibliothèque de classes et que les ajouts à cette bibliothèque se trouvent dans des assemblys séparés, mais nécessitent l'accès aux membres des assemblys existants qui sont marqués comme Friend (Visual Basic) ou internal (C#).

Notes

Vous pouvez utiliser l'attribut InternalsVisibleToAttribute pour identifier un ou plusieurs assemblys friend pour un assembly donné. L'exemple suivant utilise l'attribut InternalsVisibleToAttribute dans l'assembly A et spécifie l'assembly AssemblyB comme assembly friend. L'assembly AssemblyB peut ainsi accéder à tous les types et membres de l'assembly A qui sont marqués comme Friend (Visual Basic) ou internal (C#).

Notes

Lorsque vous compilez un assembly (assembly AssemblyB) qui accédera aux types ou membres internes d'un autre assembly (assembly A), vous devez spécifier explicitement le nom du fichier de sortie (.exe ou .dll) à l'aide de l'option de compilateur /out. Cela est obligatoire parce que le compilateur n'a pas encore généré le nom de l'assembly qu'il génère au moment de la liaison avec des références externes. Pour plus d'informations, consultez /out (C#) et /out (Visual Basic).

Imports System.Runtime.CompilerServices
Imports System
<Assembly: InternalsVisibleTo("AssemblyB")> 

' Friend class.
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub
End Class
using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default.
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method.
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}

Seuls les assemblys que vous spécifiez explicitement comme assemblys friend peuvent accéder aux types et membres Friend (Visual Basic) ou internal (C#). Par exemple, si assembly B est un assembly friend de l'assembly A et que l'assembly C référence l'assembly B, C n'a pas accès aux types Friend (Visual Basic) ou internal (C#) dans A.

Le compilateur effectue une validation de base du nom de l'assembly friend soumis à l'attribut InternalsVisibleToAttribute. Si l'assembly A déclare B comme assembly friend, les règles de validation sont les suivantes :

  • Si l'assembly A porte un nom fort, l'assembly B doit également porter un nom fort. Le nom de l'assembly friend soumis à l'attribut doit se composer du nom de l'assembly et de la clé publique du nom fort utilisée pour la signature de l'assembly B.

    Le nom de l'assembly friend soumis à l'attribut InternalsVisibleToAttribute ne peut pas être le nom fort de l'assembly B : n'incluez ni la version de l'assembly, ni la culture, ni l'architecture, ni le jeton de clé publique.

  • Si l'assembly A ne porte pas de nom fort, le nom de l'assembly friend doit n'être constitué que du nom de l'assembly. Pour plus d'informations, consultez Comment : créer des assemblys friend non signés (C# et Visual Basic).

  • Si l'assembly B porte un nom fort, spécifiez la clé du nom fort de l'assembly B, en utilisant le paramètre du projet ou le compilateur de ligne de commande /keyfile. Pour plus d'informations, consultez Comment : créer des assemblys friend signés (C# et Visual Basic).

La classe StrongNameIdentityPermission offre également la capacité de partager des types, avec les différences suivantes :

  • StrongNameIdentityPermission s'applique à un type individuel, alors qu'un assembly friend s'applique à l'assembly entier.

  • Si vous souhaitez partager des centaines de types de l'assembly A avec l'assembly B, vous devez ajouter StrongNameIdentityPermission à chacun d'eux. Si vous utilisez un assembly friend, vous ne devez déclarer la relation « friend » qu'une seule fois.

  • Si vous utilisez StrongNameIdentityPermission, les types que vous voulez partager doivent être déclarés comme publics. Si vous utilisez un assembly friend, les types partagés sont déclarés comme Friend (Visual Basic) ou internal (C#).

Pour plus d'informations sur l'accès aux types et méthodes Friend (Visual Basic) ou internal (C#) d'un assembly à partir d'un fichier de module (fichier avec l'extension . netmodule), consultez /moduleassemblyname (Visual Basic) et /moduleassemblyname (C#).

Voir aussi

Tâches

Comment : créer des assemblys friend non signés (C# et Visual Basic)

Comment : créer des assemblys friend signés (C# et Visual Basic)

Référence

InternalsVisibleToAttribute

StrongNameIdentityPermission

Concepts

Assemblys et le Global Assembly Cache (C# et Visual Basic)

Guide de programmation C#

Autres ressources

Guide de programmation Visual Basic