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

InternalsVisibleToAttribute

StrongNameIdentityPermission

Assemblys und der globale Assemblycache (C# und Visual Basic)

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

Visual Basic-Programmierhandbuch