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 assembly men kräver åtkomst till medlemmar i den assembly som testas och som är markerade som internal i C# eller Friend 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# eller Friend i Visual Basic.

Anmärkningar

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.

Anmärkning

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 de sammansättningar som du uttryckligen anger som vänner kan komma åt typer och medlemmar i internal (C#) eller Friend (Visual Basic). 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änmonteringsnamn som skickas till attributet InternalsVisibleToAttribute. Om sammansättning A deklarerar AssemblyB som en vänsammansättning är verifieringsreglerna följande:

  • Om Assembly A är starknamngiven, måste AssemblyB också vara starknamngiven. 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 för 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#) eller Friend (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).

Se även