Dela via


Anvisningar: Skapa osignerade vänsammansättningar

Det här exemplet visar hur du använder vänsammansättningar med sammansättningar som är osignerade.

Skapa en sammansättning och en vänsammansättning

  1. Öppna kommandotolken.

  2. Skapa en C#- eller Visual Basic-fil med namnet friend_unsigned_A som innehåller följande kod. Koden använder InternalsVisibleToAttribute attributet för att deklarera friend_unsigned_B som en vänsammansättning.

    // 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");
        }
    }
    
    ' friend_unsigned_A.vb
    ' Compile with:
    ' vbc -target:library friend_unsigned_A.vb
    Imports System.Runtime.CompilerServices
    
    <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
    
  3. Kompilera och signera friend_unsigned_A med hjälp av följande kommando:

    csc /target:library friend_unsigned_A.cs
    
    vbc -target:library friend_unsigned_A.vb
    
  4. Skapa en C#- eller Visual Basic-fil med namnet friend_unsigned_B som innehåller följande kod. Eftersom friend_unsigned_A anger friend_unsigned_B som en vänsammansättning kan koden i friend_unsigned_B komma åt internal (C#) eller Friend (Visual Basic) typer och medlemmar från friend_unsigned_A.

    // 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();
        }
    }
    
    ' 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
    
  5. Kompilera friend_unsigned_B med hjälp av följande kommando.

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

    Namnet på den sammansättning som genereras av kompilatorn måste matcha det vänsammansättningsnamn som skickas till InternalsVisibleToAttribute attributet. Du måste uttryckligen ange namnet på utdatasammansättningen (.exe eller .dll) med hjälp av kompilatoralternativet -out . Mer information finns i OutputAssembly (C#-kompilatoralternativ) eller -out (Visual Basic)..

  6. Kör filen friend_unsigned_B.exe .

    Programmet matar ut två strängar: Class1.Test och Class2.Test.

.NET-säkerhet

Det finns likheter mellan attributet InternalsVisibleToAttribute och StrongNameIdentityPermission klassen. Den största skillnaden är att StrongNameIdentityPermission kan kräva säkerhetsbehörigheter för att köra ett visst kodavsnitt, medan InternalsVisibleToAttribute attributet styr synligheten för internal eller Friend (Visual Basic) typer och medlemmar.

Se även