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

Cet exemple indique comment utiliser des assemblys friend avec les assemblys non signés.

Pour créer un assembly et un assembly friend dans Visual Studio

  1. Ouvrez une invite de commandes Visual Studio.

  2. Créez un fichier Visual Basic ou C# nommé friend_signed_A qui contient le code suivant. Le code utilise l'attribut InternalsVisibleToAttribute pour déclarer friend_signed_B en tant qu'assembly friend.

    ' friend_unsigned_A.vb
    ' Compile with: 
    ' Vbc /target:library friend_unsigned_A.vb
    Imports System.Runtime.CompilerServices
    Imports System
    
    <Assembly: InternalsVisibleTo("friend_unsigned_B")> 
    
    ' Friend type.
    Friend Class Class1
        Public Sub Test()
            Console.WriteLine("Class1.Test")
        End Sub
    End Class
    
    ' Public type with Friend member.
    Public Class Class2
        Friend Sub Test()
            Console.WriteLine("Class2.Test")
        End Sub
    End Class
    
    // friend_unsigned_A.cs
    // Compile with: 
    // csc /target:library friend_unsigned_A.cs
    using System.Runtime.CompilerServices;
    using System;
    
    [assembly: InternalsVisibleTo("friend_unsigned_B")]
    
    // Type is internal by default.
    class Class1
    {
        public void Test()
        {
            Console.WriteLine("Class1.Test");
        }
    }
    
    // Public type with internal member.
    public class Class2
    {
        internal void Test()
        {
            Console.WriteLine("Class2.Test");
        }
    }
    
  3. Compilez et signez friend_signed_A à l'aide de la commande suivante.

    Vbc /target:library friend_unsigned_A.vb
    
    csc /target:library friend_unsigned_A.cs
    
  4. Créez un fichier Visual Basic ou C# nommé friend_unsigned_B qui contient le code suivant. Étant donné que friend_unsigned_A spécifie friend_unsigned_B comme assembly friend, le code de friend_unsigned_B peut accéder aux types et membres Friend (Visual Basic) ou internal (C#) à partir de friend_unsigned_A.

    ' friend_unsigned_B.vb
    ' Compile with: 
    ' Vbc /r:friend_unsigned_A.dll friend_unsigned_B.vb
    Module Module1
        Sub Main()
            ' Access a Friend type.
            Dim inst1 As New Class1()
            inst1.Test()
    
            Dim inst2 As New Class2()
            ' Access a Friend member of a public type.
            inst2.Test()
    
            System.Console.ReadLine()
        End Sub
    End Module
    
    // friend_unsigned_B.cs
    // Compile with: 
    // csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
    public class Program
    {
        static void Main()
        {
            // Access an internal type.
            Class1 inst1 = new Class1();
            inst1.Test();
    
            Class2 inst2 = new Class2();
            // Access an internal member of a public type.
            inst2.Test();
    
            System.Console.ReadLine();
        }
    }
    
  5. Compilez friend_signed_B à l'aide de la commande suivante.

    Vbc /r:friend_unsigned_A.dll friend_unsigned_B.vb
    
    csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
    

    Le nom de l'assembly qui est généré par le compilateur doit correspondre au nom d'assembly friend qui est passé à l'attribut InternalsVisibleToAttribute. Vous pouvez définir explicitement l'assembly en utilisant l'option du compilateur /out.

    En C#, vous devez spécifier explicitement le nom de l'assembly de sortie (.exe ou .dll) à l'aide de l'option de compilateur /out. En Visual Basic, cette opération est facultative. Pour plus d'informations, consultez /out (Visual Basic) et /out (Options du compilateur C#).

  6. Exécutez le fichier friend_signed_B.exe.

    Le programme imprime deux chaînes : « Class1.Test » et « Class2.Test ».

Sécurité

Il existe des ressemblances entre l'attribut InternalsVisibleToAttribute et la classe StrongNameIdentityPermission. La principale différence réside dans le fait que StrongNameIdentityPermission peut demander des autorisations de sécurité pour exécuter une section particulière de code, alors que l'attribut InternalsVisibleToAttribute contrôle la visibilité des types et membres Friend (Visual Basic) ou internal (C#).

Voir aussi

Tâches

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

Référence

InternalsVisibleToAttribute

Concepts

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

Assemblys friend (C# et Visual Basic)

Guide de programmation C#

Autres ressources

Guide de programmation Visual Basic