Vriendenassembly's
Een vriendassembly is een assembly die toegang heeft tot de interne typen (C#) of Vriend (Visual Basic) van een andere assembly en leden. 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# ofFriend
in Visual Basic.Wanneer u een klassebibliotheek en toevoegingen aan de bibliotheek ontwikkelt, bevinden zich in afzonderlijke assembly's, maar hebt u toegang nodig tot leden in bestaande assembly's die zijn gemarkeerd als
internal
in C# ofFriend
in Visual Basic.
Opmerkingen
U kunt het InternalsVisibleToAttribute kenmerk gebruiken om een of meer vriendassembly's voor een bepaalde assembly 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.
Notitie
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 assembly's die u expliciet opgeeft als vrienden, hebben toegang 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 assemblynaam van de vriend die is doorgegeven aan het InternalsVisibleToAttribute kenmerk. Als Assembly A AssemblyB 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 vriend-assembly die wordt doorgegeven aan het kenmerk, moet bestaan uit de assemblynaam en de openbare sleutel van de sterke-naamsleutel die wordt gebruikt om AssemblyB te ondertekenen.
De naam van de vriendassembly die wordt doorgegeven aan het InternalsVisibleToAttribute kenmerk, 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. Zie Procedure voor meer informatie : Niet-ondertekende vriendenassembly's maken.
Als AssemblyB sterk benoemd is, moet u de sleutel voor de sterke naam voor AssemblyB opgeven met behulp van de projectinstelling of de opdrachtregelcompileroptie
/keyfile
. Zie Instructies voor meer informatie : Ondertekende vriendenassembly's maken.
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 vriendassembly 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 vriendassembly gebruikt, hoeft u de relatie met een vriend slechts één keer te declareren.
Als u gebruikt StrongNameIdentityPermission, moeten de typen die u wilt delen worden gedeclareerd als openbaar. Als u een vriendassembly gebruikt, worden de gedeelde typen gedeclareerd als
internal
(C#) ofFriend
(Visual Basic).
Zie ModuleAssemblyName (C#) of -moduleassemblyname (Visual Basic) voor informatie over het openen van de typen en methoden van een assembly internal
vanuit een modulebestand (een bestand met de extensie .netmodule), moduleAssemblyName (C#) of -moduleassemblyname (Visual Basic).Friend