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
Öppna kommandotolken.
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
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
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#) ellerFriend
(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
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)..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.