Delen via


Vriendenbijeenkomsten

Een vriendassembly is een assembly die toegang heeft tot de interne typen en leden van een andere assembly in C# of Vriend typen en leden in Visual Basic. Als u een assemblykenmerk aan AssemblyA toevoegt om AssemblyB te identificeren als een vriendassembly, hoeft u typen en leden in AssemblyA niet langer als openbaar te markeren om ze te kunnen openen door AssemblyB. Dit is vooral handig in de volgende scenario's:

  • Tijdens het testen van eenheden, wanneer de testcode wordt uitgevoerd in een afzonderlijke assembly, maar er is toegang vereist tot leden in de assembly die zijn gemarkeerd als internal in C# of Friend in Visual Basic.

  • Wanneer u een klassebibliotheek ontwikkelt en toevoegingen aan de bibliotheek zich in afzonderlijke assembly's bevinden, maar u toegang nodig hebt tot leden in bestaande assembly's die zijn gemarkeerd als internal in C# of Friend in Visual Basic.

Opmerkingen

U kunt het InternalsVisibleToAttribute kenmerk gebruiken om een of meer vriendenassemblages voor een bepaalde assemblage te identificeren. In het volgende voorbeeld wordt het InternalsVisibleToAttribute kenmerk in AssemblyA gebruikt en wordt assembly AssemblyB opgegeven als een vriendassembly. Dit geeft assembly AssemblyB toegang tot alle typen en leden in Assembly A die zijn gemarkeerd als internal in C# of Friend in Visual Basic.

Opmerking

Wanneer u een assembly compileert zoals AssemblyB die toegang heeft tot interne typen of interne leden van een andere assembly, zoals AssemblyA, moet u expliciet de naam van het uitvoerbestand (.exe of .dll) opgeven met behulp van de optie -out compiler. Dit is vereist omdat de compiler nog niet de naam heeft gegenereerd voor de assembly die het bouwt op het moment dat deze is gebonden aan externe verwijzingen. Zie OutputAssembly (C#) of -out (Visual Basic) voor meer informatie.

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

Alleen assemblies die u expliciet opgeeft als vrienden kunnen toegang krijgen tot internal (C#) of Friend (Visual Basic) typen en leden. Als AssemblyB bijvoorbeeld een vriend is van Assembly A en Assembly C verwijst naar Assembly C, heeft Assembly C geen toegang tot internal (C#) of Friend (Visual Basic) typen in Assembly A.

De compiler voert een eenvoudige validatie uit van de naam van de vriendassembly die is doorgegeven aan het InternalsVisibleToAttribute attribuut. Als Assembly AAssemblyB als een vriendassembly declareert, zijn de validatieregels als volgt:

  • Als Assembly A een sterke naam heeft, moet AssemblyB ook een sterke naam hebben. De naam van de vriendassemblage die aan het kenmerk wordt doorgegeven, moet bestaan uit de assemblynaam en de openbare sleutel van de sterke-naamsleutel die wordt gebruikt om AssemblyB te signeren.

    De naam van de vriend-assembly die wordt doorgegeven aan het InternalsVisibleToAttribute attribuut, mag niet de sterke naam van AssemblyB zijn. Neem niet de assemblyversie, cultuur, architectuur of openbare-sleuteltoken op.

  • Als Assembly A geen sterke naam heeft, moet de naam van de vriendassembly alleen bestaan uit de assemblynaam. Voor meer informatie, zie Hoe te doen: Niet-ondertekende vriendenassembly's maken.

  • Als AssemblyB met een sterke naam is, moet u de sterke-naamsleutel van AssemblyB opgeven via de projectinstelling of de opdrachtregelcompileroptie /keyfile. Zie Hoe te: Ondertekende vriendenassemblies maken voor meer informatie.

De StrongNameIdentityPermission klasse biedt ook de mogelijkheid om typen te delen, met de volgende verschillen:

  • StrongNameIdentityPermission is van toepassing op een afzonderlijk type, terwijl een friend assembly van toepassing is op de hele assembly.

  • Als er honderden typen in Assembly A zijn die u wilt delen met AssemblyB, moet u deze allemaal toevoegen StrongNameIdentityPermission . Als u een vriend-assembly gebruikt, hoeft u de vriendrelatie slechts één keer te declareren.

  • Als u gebruikt StrongNameIdentityPermission, moeten de typen die u wilt delen worden gedeclareerd als openbaar. Als u een Friend-assembly gebruikt, worden de gedeelde typen gedeclareerd als internal (C#) of Friend (Visual Basic).

Zie ModuleAssemblyName (C#) of -moduleassemblyname (Visual Basic) voor informatie over het benaderen van de typen en methoden van een assembly vanuit een modulebestand, een bestand met de internal-extensie, Friend or -moduleassemblyname (Visual Basic).

Zie ook