Vänsammansättningar
En vänsammansättning är en sammansättning som kan komma åt en annan sammansättnings interna (C#) eller Vän (Visual Basic) typer och medlemmar. Om du lägger till ett sammansättningsattribut i AssemblyA för att identifiera AssemblyB som en vänsammansättning behöver du inte längre markera typer och medlemmar i AssemblyA som offentliga för att de ska kunna nås av AssemblyB. Detta är särskilt praktiskt i följande scenarier:
Under enhetstestning, när testkoden körs i en separat sammansättning men kräver åtkomst till medlemmar i sammansättningen som testas som
internal
i C# ellerFriend
i Visual Basic.När du utvecklar ett klassbibliotek och tillägg till biblioteket finns i separata sammansättningar men kräver åtkomst till medlemmar i befintliga sammansättningar som är markerade som
internal
i C# ellerFriend
i Visual Basic.
Kommentarer
Du kan använda InternalsVisibleToAttribute attributet för att identifiera en eller flera vänsammansättningar för en viss sammansättning. I följande exempel används InternalsVisibleToAttribute attributet i AssemblyA och anger sammansättning AssemblyB som en vänsammansättning. Detta ger assembly AssemblyB åtkomst till alla typer och medlemmar i sammansättning A som har markerats som internal
i C# eller Friend
Visual Basic.
Kommentar
När du kompilerar en sammansättning som AssemblyB som kommer åt interna typer eller interna medlemmar i en annan sammansättning som AssemblyA, måste du uttryckligen ange namnet på utdatafilen (.exe eller .dll) med hjälp av kompilatoralternativet -out. Detta krävs eftersom kompilatorn ännu inte har genererat namnet på den sammansättning som skapas när den binder till externa referenser. Mer information finns i OutputAssembly (C#) eller -out (Visual Basic).
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");
}
}
Imports System.Runtime.CompilerServices
<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
Endast sammansättningar som du uttryckligen anger som vänner kan komma åt internal
(C#) eller Friend
(Visual Basic) typer och medlemmar. Om AssemblyB till exempel är en vän till sammansättning A och sammansättning C refererar till AssemblyB, har sammansättning C inte åtkomst till internal
(C#) eller Friend
(Visual Basic) typer i sammansättning A.
Kompilatorn utför en grundläggande validering av det vänsammansättningsnamn som skickas InternalsVisibleToAttribute till attributet. Om sammansättning A deklarerar AssemblyB som en vänsammansättning är verifieringsreglerna följande:
Om sammansättning A är stark måste AssemblyB också vara starkt namngivet. Det vänsammansättningsnamn som skickas till attributet måste bestå av sammansättningsnamnet och den offentliga nyckeln för den starka namnnyckeln som används för att signera AssemblyB.
Det vänsammansättningsnamn som skickas till InternalsVisibleToAttribute attributet kan inte vara det starka namnet på AssemblyB. Ta inte med sammansättningsversionen, kulturen, arkitekturen eller den offentliga nyckeltoken.
Om sammansättning A inte är stark bör namnet på vänsammansättningen endast bestå av sammansättningsnamnet. Mer information finns i Så här skapar du osignerade vänsammansättningar.
Om AssemblyB är starkt namngivet måste du ange starknamnsnyckeln för AssemblyB med hjälp av projektinställningen eller kommandoradskompileringsalternativet
/keyfile
. Mer information finns i Så här skapar du signerade vänsammansättningar.
Klassen StrongNameIdentityPermission ger också möjlighet att dela typer med följande skillnader:
StrongNameIdentityPermission gäller för en enskild typ, medan en vänsammansättning gäller för hela sammansättningen.
Om det finns hundratals typer i sammansättning A som du vill dela med AssemblyB måste du lägga StrongNameIdentityPermission till dem alla. Om du använder en vänsammansättning behöver du bara deklarera vänrelationen en gång.
Om du använder StrongNameIdentityPermissionmåste de typer som du vill dela deklareras som offentliga. Om du använder en vänsammansättning deklareras de delade typerna som
internal
(C#) ellerFriend
(Visual Basic).
Information om hur du kommer åt en sammansättnings internal
(C#) eller Friend
(Visual Basic) typer och metoder från en modulfil (en fil med .netmodule-tillägget ) finns i ModuleAssemblyName (C#) eller -moduleassemblyname (Visual Basic).