Friend-Assemblys

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 Assemblyattribut hinzufügen, um AssemblyB als Friend-Assembly zu identifizieren, müssen Sie Typen und Member in AssemblyA nicht mehr als öffentlich markieren, damit AssemblyB auf sie zugreifen kann. Dies ist insbesondere in folgenden Szenarios nützlich:

  • Wenn der Testcode bei Komponententests in einer separaten Assembly ausgeführt wird, aber Zugriff auf Member in der getesteten Assembly benötigt, die als internal in C# oder Friend in Visual Basic markiert sind.

  • Wenn beim Entwickeln einer Klassenbibliothek die Ergänzungen der Bibliothek in separaten Assemblys enthalten sind, aber Zugriff auf Member in vorhandenen Assemblys erfordern, die als internal in C# oder Friend in Visual Basic markiert sind.

Hinweise

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 Attribut InternalsVisibleToAttribute in AssemblyA verwendet, und AssemblyB wird als Friend-Assembly angegeben. Dadurch erhält Assembly B Zugriff auf alle Typen und Member in Assembly A, die als internal (C#) oder Friend (Visual Basic) markiert sind.

Hinweis

Wenn Sie eine Assembly wie AssemblyB kompilieren, die auf interne Typen oder Member einer anderen Assembly wie AssemblyA zugreift, müssen Sie den Namen der Ausgabedatei (.exe oder .dll) explizit mithilfe der Compileroption -out festlegen. Dies ist erforderlich, da der Compiler den Namen für die Assembly, die er erstellt, noch nicht generiert hat, wenn er Bindungen an externe Referenzen vornimmt. 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 Assembly B beispielsweise ein Friend von Assembly A ist und Assembly C auf Assembly B verweist, verfügt Assembly C nicht über Zugriff auf die Typen internal (C#) oder Friend (Visual Basic) 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 A die Assembly B als Friend-Assembly deklariert, lauten die Validierungsregeln wie folgt:

  • Wenn Assembly A einen starken Namen hat, muss Assembly B auch einen starken Namen haben. 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 Assembly B einen starken Namen hat, müssen Sie die Schlüsseldatei mit starkem Namen für Assembly B über die Projekteinstellung oder über die Compileroption /keyfile in der Befehlszeile angeben. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von signierten Friend-Assemblys.

Die Klasse StrongNameIdentityPermission bietet auch die Möglichkeit zur Freigabe von Typen mit folgenden Unterschieden:

  • StrongNameIdentityPermission gilt für einen einzelnen Typ, während eine Friend-Assembly für die gesamte Assembly gilt.

  • Wenn Hunderte Typen in Assembly A vorliegen, die Sie für Assembly B freigeben möchten, müssen Sie StrongNameIdentityPermission zu allen Typen hinzufügen. Wenn Sie 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. Wenn Sie eine Friend-Assembly verwenden, werden die freigegebenen Typen in internal (C#) oder Friend (Visual Basic) deklariert.

Informationen darüber, wie Sie auf die internal- (C#) oder Friend-Methoden (Visual Basic) einer Assembly aus einer Moduldatei (einer Datei mit der Erweiterung .netmodule) zugreifen, finden Sie unter ModuleAssemblyName (C#) oder -moduleassemblyname (Visual Basic).

Siehe auch