Friend-AssemblysFriend assemblies

Eine Friend-Assembly ist eine Assembly, die auf die Friend- (Visual Basic) oder internen (C#) Typen und Member einer anderen Assembly zugreifen kann.A friend assembly is an assembly that can access another assembly's internal (C#) or Friend (Visual Basic) types and members. Wenn Sie eine Assembly als Friend-Assembly identifizieren, müssen Sie Typen und Member nicht mehr als öffentlich markieren, damit andere Assemblys auf sie zugreifen können.If you identify an assembly as a friend assembly, you no longer have to mark types and members as public in order for them to be accessed by other assemblies. Dies ist insbesondere in folgenden Szenarios nützlich:This is especially convenient in the following scenarios:

  • 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.During unit testing, when test code runs in a separate assembly but requires access to members in the assembly being tested that are marked as internal in C# or Friend in Visual Basic.

  • 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.When you are developing a class library and additions to the library are contained in separate assemblies but require access to members in existing assemblies that are marked as internal in C# or Friend in Visual Basic.

AnmerkungenRemarks

Sie können das Attribut InternalsVisibleToAttribute verwenden, um eine oder mehrere Friend-Assemblys für eine angegebene Assembly zu identifizieren.You can use the InternalsVisibleToAttribute attribute to identify one or more friend assemblies for a given assembly. Im folgenden Beispiel wird das Attribut InternalsVisibleToAttribute in Assembly A verwendet, und Assembly B wird als Friend-Assembly angegeben.The following example uses the InternalsVisibleToAttribute attribute in Assembly A and specifies assembly AssemblyB as a friend assembly. Dadurch erhält Assembly B Zugriff auf alle Typen und Member in Assembly A, die als internal (C#) oder Friend (Visual Basic) markiert sind.This gives assembly AssemblyB access to all types and members in Assembly A that are marked as internal in C# or Friend in Visual Basic.

Hinweis

Wenn Sie eine Assembly wie Assembly B kompilieren, die auf interne Typen oder Member einer anderen Assembly wie Assembly A zugreift, müssen Sie den Namen der Ausgabedatei ( .exe oder .dll) explizit mithilfe der Compileroption -out festlegen.When you compile an assembly like AssemblyB that will access internal types or internal members of another assembly like Assembly A, you must explicitly specify the name of the output file (.exe or .dll) by using the -out compiler option. 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.This is required because the compiler has not yet generated the name for the assembly it is building at the time it is binding to external references. Weitere Informationen hierzu finden Sie unter -out (C#) oder -out (Visual Basic).For more information, see -out (C#) or -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.Only assemblies that you explicitly specify as friends can access internal (C#) or Friend (Visual Basic) types and members. 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.For example, if AssemblyB is a friend of Assembly A and Assembly C references AssemblyB, Assembly C does not have access to internal (C#) or Friend (Visual Basic) types in Assembly A.

Der Compiler führt eine grundlegende Prüfung des Namens der Friend-Assembly durch, der an das Attribut InternalsVisibleToAttribute übergeben wird.The compiler performs some basic validation of the friend assembly name passed to the InternalsVisibleToAttribute attribute. Wenn Assembly A die Assembly B als Friend-Assembly deklariert, lauten die Validierungsregeln wie folgt:If Assembly A declares AssemblyB as a friend assembly, the validation rules are as follows:

  • Wenn Assembly A einen starken Namen hat, muss Assembly B auch einen starken Namen haben.If Assembly A is strong named, AssemblyB must also be strong named. 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.The friend assembly name that is passed to the attribute must consist of the assembly name and the public key of the strong-name key that is used to sign AssemblyB.

    Der Name der Friend-Assembly, der an das InternalsVisibleToAttribute-Attribut übergeben wird, kann nicht der starke Name der Assembly B sein.The friend assembly name that is passed to the InternalsVisibleToAttribute attribute cannot be the strong name of AssemblyB. Fügen Sie keine Assemblyversion, Kultur, Architektur und kein öffentliches Schlüsseltoken ein.Don't include the assembly version, culture, architecture, or public key token.

  • Wenn Assembly A keinen starken Namen hat, sollte der Name der Friend-Assembly nur aus dem Assemblynamen bestehen.If Assembly A is not strong named, the friend assembly name should consist of only the assembly name. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von unsignierten Friend-Assemblys.For more information, see How to: Create unsigned friend assemblies.

  • 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.If AssemblyB is strong named, you must specify the strong-name key for AssemblyB by using the project setting or the command-line /keyfile compiler option. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von signierten Friend-Assemblys.For more information, see How to: Create signed friend assemblies.

Die Klasse StrongNameIdentityPermission bietet auch die Möglichkeit zur Freigabe von Typen mit folgenden Unterschieden:The StrongNameIdentityPermission class also provides the ability to share types, with the following differences:

  • StrongNameIdentityPermission gilt für einen einzelnen Typ, während eine Friend-Assembly für die gesamte Assembly gilt.StrongNameIdentityPermission applies to an individual type, while a friend assembly applies to the whole assembly.

  • 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.If there are hundreds of types in Assembly A that you want to share with AssemblyB, you have to add StrongNameIdentityPermission to all of them. Wenn Sie eine Friend-Assembly verwenden, müssen Sie die Friend-Beziehung nur einmal deklarieren.If you use a friend assembly, you only need to declare the friend relationship once.

  • Bei Verwendung von StrongNameIdentityPermission müssen die Typen, die Sie freigeben möchten, als öffentlich deklariert werden.If you use StrongNameIdentityPermission, the types you want to share have to be declared as public. Wenn Sie eine Friend-Assembly verwenden, werden die freigegebenen Typen in internal (C#) oder Friend (Visual Basic) deklariert.If you use a friend assembly, the shared types are declared as internal (C#) or Friend (Visual Basic).

Informationen darüber, wie Sie über eine Moduldatei (eine Datei mit der Dateierweiterung .netmodule) auf die Typen und Methoden internal (C#) oder Friend (Visual Basic) zugreifen, finden Sie unter -moduleassemblyname (C#) oder -moduleassemblyname (Visual Basic).For information about how to access an assembly's internal (C#) or Friend (Visual Basic) types and methods from a module file (a file with the .netmodule extension), see -moduleassemblyname (C#) or -moduleassemblyname (Visual Basic).

Siehe auchSee also