Friend-Assemblys (C# und Visual Basic)
Eine Friend-Assembly ist eine Assembly, die auf die als Friend (Visual Basic) bzw. als internal (C#) gekennzeichneten Typen und Member einer anderen Assembly zugreifen kann. Wenn Sie eine Assembly als Friend-Assembly identifizieren, müssen Sie Typen und Member nicht mehr als öffentlich kennzeichnen, damit andere Assemblys auf sie zugreifen können. Dies ist insbesondere in den folgenden Szenarien nützlich:
Bei Komponententests, wenn Testcode in einer eigenen Assembly ausgeführt wird, jedoch Zugriff auf Member der zu testenden Assembly erfordert, die als Friend (Visual Basic) bzw. internal (C#) gekennzeichnet sind.
Beim Entwickeln einer Klassenbibliothek, wenn Erweiterungen der Bibliothek in eigenen Assemblys enthalten sind, jedoch Zugriff auf Member in vorhandenen Assemblys erfordern, die als Friend (Visual Basic) bzw. internal (C#) gekennzeichnet sind.
Hinweise
Mithilfe des InternalsVisibleToAttribute-Attributs können Sie eine oder mehrere Friend-Assemblys für eine bestimmte Assembly identifizieren. Im folgenden Beispiel wird das InternalsVisibleToAttribute-Attribut in Assembly A verwendet, und AssemblyB wird als Friend-Assembly angegeben. Auf diese Weise erhält AssemblyB Zugriff auf alle Typen und Member in Assembly A, die als Friend (Visual Basic) bzw. internal (C#) gekennzeichnet sind.
Tipp
Beim Kompilieren einer Assembly (Assembly AssemblyB), die auf die internen Typen oder internen Member einer anderen Assembly (Assembly A) zugreift, müssen Sie mit der /out-Compileroption explizit den Namen der Ausgabedatei (EXE- oder DLL-Datei) angeben. Dies ist notwendig, da der Compiler noch nicht den Namen für die Assembly generiert hat, die er beim Binden an externe Verweise erstellt. Weitere Informationen finden Sie unter /out (C#) und unter /out (Visual Basic).
Imports System.Runtime.CompilerServices
Imports System
<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
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");
}
}
Nur explizit als Friend-Assemblys angegebene Assemblys können auf Typen und Member zugreifen, die als Friend (Visual Basic) bzw. als internal (C#) gekennzeichnet sind. Wenn beispielsweise die Assembly B in Assembly A als Friend-Assembly angegeben ist und Assembly C auf Assembly B verweist, hat die Assembly C keinen Zugriff auf die als Friend (Visual Basic) bzw. als internal (C#) gekennzeichneten Typen in Assembly A.
Der Compiler führt für den Namen der Friend-Assembly, der dem InternalsVisibleToAttribute-Attribut übergeben wird, einige grundlegende Validierungen durch. Wenn Assembly A Assembly B als Friend-Assembly deklariert, gelten die folgenden Validierungsregeln:
Wenn Assembly A einen starken Namen verwendet, muss auch Assembly B einen starken Namen verwenden. Der Name der Friend-Assembly, der dem Attribut übergeben wird, muss aus dem Assemblynamen und dem öffentlichen Schlüssel des Schlüssels mit starkem Namen bestehen, mit dem Assembly B signiert wird.
Der Name der Friend-Assembly, der dem InternalsVisibleToAttribute-Attribut übergeben wird, kann nicht der starke Name von Assembly B sein: Geben Sie für die Assembly weder die Version, die Kultur, die Architektur noch das öffentliche Schlüsseltoken an.
Wenn Assembly A keinen starken Namen verwendet, sollte der Name der Friend-Assembly nur aus dem Assemblynamen bestehen. Weitere Informationen finden Sie unter Gewusst wie: Erstellen von nicht signierten Friend-Assemblys (C# und Visual Basic).
Wenn Assembly B einen starken Namen verwendet, müssen Sie für Assembly B in den Projekteinstellungen oder auf der Befehlszeile mithilfe der /keyfile-Compileroption den Schlüssel mit starkem Namen angeben. Weitere Informationen finden Sie unter Gewusst wie: Erstellen von signierten Friend-Assemblys (C# und Visual Basic).
Auch die StrongNameIdentityPermission-Klasse bietet die Möglichkeit, Typen freizugeben. Es bestehen jedoch folgende Unterschiede:
StrongNameIdentityPermission gilt für einen einzelnen Typ, während eine friend-Assembly für die ganze Assembly gilt.
Wenn Assembly A Hunderte von Typen enthält, auf die auch Assembly B Zugriff haben soll, müssen Sie jedem dieser Typen das StrongNameIdentityPermission-Element hinzufügen. Wenn Sie jedoch eine Friend-Assembly verwenden, müssen Sie die friend-Beziehung nur einmal deklarieren.
Bei Verwendung von StrongNameIdentityPermission müssen die Typen, die Sie freigeben möchten, als öffentlich deklariert werden. Bei Verwendung einer Friend-Assembly werden die freigegebenen Typen als Friend (Visual Basic) bzw. als internal (C#) deklariert.
Informationen zum Zugriff auf die als Friend (Visual Basic) bzw. als internal (C#) gekennzeichneten Typen und Methoden aus einer Moduldatei (eine Datei mit der . netmodule-Erweiterung finden Sie unter /moduleassemblyname (Visual Basic) bzw. unter /moduleassemblyname (C#).
Siehe auch
Aufgaben
Gewusst wie: Erstellen von nicht signierten Friend-Assemblys (C# und Visual Basic)
Gewusst wie: Erstellen von signierten Friend-Assemblys (C# und Visual Basic)
Referenz
Assemblys und der globale Assemblycache (C# und Visual Basic)