Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Friend-Assembly ist eine Assembly, die auf die Friend- (Visual Basic) oder internen (C#) Typen und Member einer anderen Assembly zugreifen kann. Wenn Sie assemblyA ein Assembly-Attribut hinzufügen, um AssemblyB als Freund-Assembly zu identifizieren, müssen Sie Typen und Member in AssemblyA nicht mehr als öffentlich markieren, damit auf sie von AssemblyB zugegriffen werden kann. Dies ist besonders praktisch in den folgenden Szenarien:
Während des Komponententests wird der Testcode in einer separaten Assembly ausgeführt, wobei jedoch Zugriff auf Member in der getesteten Assembly erforderlich ist, die als
internalin C# oderFriendin Visual Basic gekennzeichnet sind.Wenn Sie eine Klassenbibliothek entwickeln und Erweiterungen zur Bibliothek in separaten Assemblys enthalten sind, jedoch Zugriff auf Mitglieder in vorhandenen Assemblys benötigen, die in C# als
internaloder in Visual Basic alsFriendgekennzeichnet sind.
Bemerkungen
Sie können das Attribut InternalsVisibleToAttribute verwenden, um eine oder mehrere Friend-Assemblys für eine angegebene Assembly zu identifizieren. Im folgenden Beispiel wird das InternalsVisibleToAttribute-Attribut in AssemblyA verwendet und AssemblyB als Freundassembly angegeben. Dadurch erhält AssemblyB Zugriff auf alle Typen und Member in Assembly A , die als internal in C# oder Friend in Visual Basic gekennzeichnet sind.
Hinweis
Wenn Sie eine Assembly wie AssemblyB kompilieren, die auf interne Typen oder interne Member einer anderen Assembly wie AssemblyA zugreift, müssen Sie explizit den Namen der Ausgabedatei (.exe oder .dll) mithilfe der Compileroption -out angeben. Dies ist erforderlich, da der Compiler noch nicht den Namen für die Assembly generiert hat, die zum Zeitpunkt der Bindung an externe Verweise erstellt wird. Weitere Informationen finden Sie unter OutputAssembly (C#) oder -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
Nur Assemblys, die Sie explizit als Friends angeben, können auf die Typen und Member internal (C#) oder Friend (Visual Basic) zugreifen. Wenn AssemblyB beispielsweise ein Freund von Assembly A und Assembly C ist, auf AssemblyB verweist, hat Assembly C keinen Zugriff auf internal (C#)- oder Friend (Visual Basic)-Typen in Assembly A.
Der Compiler führt eine grundlegende Prüfung des Namens der Friend-Assembly durch, der an das Attribut InternalsVisibleToAttribute übergeben wird. Wenn Assembly AAssemblyB als Freundassembly deklariert, sind die Validierungsregeln wie folgt:
Wenn Assembly A stark benannt ist, muss AssemblyB ebenfalls stark benannt sein. Der Name der Friend-Assembly, der an das Attribut übergeben wird, muss aus dem Namen der Assembly und dem öffentlichen Schlüssel der Schlüsseldatei mit starkem Namen bestehen, der zum Signieren von Assembly B verwendet wird.
Der Name der Friend-Assembly, der an das InternalsVisibleToAttribute-Attribut übergeben wird, kann nicht der starke Name der Assembly B sein. Fügen Sie keine Assemblyversion, Kultur, Architektur und kein öffentliches Schlüsseltoken ein.
Wenn Assembly A keinen starken Namen hat, sollte der Name der Friend-Assembly nur aus dem Assemblynamen bestehen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von unsignierten Friend-Assemblys.
Wenn AssemblyB stark benannt ist, müssen Sie den Schlüssel mit starkem Namen für AssemblyB mithilfe der Projekteinstellung oder der Befehlszeilencompileroption
/keyfileangeben. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von signierten Friend-Assemblys.
Die StrongNameIdentityPermission Klasse bietet auch die Möglichkeit, Typen mit den folgenden Unterschieden zu teilen:
StrongNameIdentityPermission gilt für einen einzelnen Typ, während eine Friend-Assembly für die gesamte Assembly gilt.
Wenn es Hunderte von Typen in Assembly A gibt, die Sie für AssemblyB freigeben möchten, müssen Sie sie allen hinzufügen StrongNameIdentityPermission . Wenn Sie eine Freundesassembly verwenden, müssen Sie die Freundschaftsbeziehung nur einmal deklarieren.
Wenn Sie StrongNameIdentityPermission verwenden, müssen die Typen, die Sie freigeben möchten, als öffentlich deklariert werden. Wenn Sie eine Friend-Assembly verwenden, werden die freigegebenen Typen in
internal(C#) oderFriend(Visual Basic) deklariert.
Informationen zum Zugreifen auf die Typen und Methoden einer Assembly internal (C#) oder Friend (Visual Basic) aus einer Moduldatei (einer Datei mit der Erweiterung .netmodule) finden Sie unter ModuleAssemblyName (C#) oder -moduleassemblyname (Visual Basic).