Friend-Assemblys (C#)Friend Assemblies (C#)

Eine Friend-Assembly ist eine Assembly, die auf die internen Typen und Member einer anderen Assembly zugreifen kann.A friend assembly is an assembly that can access another assembly's internal 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 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 .

  • 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 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 .

HinweiseRemarks

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 AssemblyB 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 AssemblyB Zugriff auf alle Typen und Member in Assembly A, die als internal markiert sind.This gives assembly AssemblyB access to all types and members in assembly A that are marked as internal.

Hinweis

Beim Kompilieren einer Assembly (Assembly AssemblyB), die auf interne Typen oder interne Member einer anderen Assembly (Assembly A) zugreift, müssen Sie den Namen der Ausgabedatei (.exe oder .dll) mit der Compileroption /out explizit angeben.When you compile an assembly (assembly AssemblyB) that will access internal types or internal members of another assembly (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 finden Sie unter /out (C#).For more information, see /out (C#) .

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 Assemblys, die Sie explizit als Friends angeben, können auf internal-Typen und -Member zugreifen.Only assemblies that you explicitly specify as friends can access internal types and members. Wenn zum Beispiel Assembly B ein Friend von Assembly A ist und Assembly C auf Assembly B verweist, hat C keinen Zugriff auf internal-Typen in A.For example, if assembly B is a friend of assembly A and assembly C references assembly B, C does not have access to internal types in 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 Assembly B als Friend-Assembly deklariert, lauten die Validierungsregeln wie folgt:If assembly A declares B 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, assembly B 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 assembly B.

    Der Name der Friend-Assembly, der an das Attribut InternalsVisibleToAttribute übergeben wird, darf nicht der starke Name von Assembly B sein: Er darf nicht die Assemblyversion, Kultur, Architektur oder das Token des öffentlichen Schlüssels enthalten.The friend assembly name that is passed to the InternalsVisibleToAttribute attribute cannot be the strong name of assembly B: do not 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 nicht signierten Friend-Assemblys (C#).For more information, see How to: Create Unsigned Friend Assemblies (C#).

  • Wenn Assembly B einen starken Namen hat, müssen Sie die Schlüsseldatei mit starkem Namen für Assembly B über die Projekteinstellung oder bei Verwendung der Befehlszeile die Compileroption /keyfile angeben.If assembly B is strong named, you must specify the strong-name key for assembly B by using the project setting or the command-line /keyfile compiler option. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen von signierten Friend-Assemblys (C#).For more information, see How to: Create Signed Friend Assemblies (C#).

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 es Hunderte von Typen in Assembly A gibt, die Sie für Assembly B freigeben möchten, müssen Sie allen StrongNameIdentityPermission hinzufügen.If there are hundreds of types in assembly A that you want to share with assembly B, 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 als internal deklariert.If you use a friend assembly, the shared types are declared as internal.

Informationen darüber, wie Sie auf internal-Typen und -Methoden einer Assembly aus einer Moduldatei (eine Datei mit der Erweiterung .netmodule) zugreifen können, finden Sie unter /moduleassemblyname (C#).For information about how to access an assembly's internal types and methods from a module file (a file with the .netmodule extension), see /moduleassemblyname (C#).

Siehe auchSee Also

InternalsVisibleToAttribute
StrongNameIdentityPermission
Vorgehensweise: Erstellen von unsignierten Friend-Assemblys (c#)How to: Create Unsigned Friend Assemblies (C#)
Vorgehensweise: Erstellen von signierten Friend-Assemblys (c#)How to: Create Signed Friend Assemblies (C#)
Assemblies and the Global Assembly Cache (C#) (Assemblys und der globale Assemblycache (C#))Assemblies and the Global Assembly Cache (C#)
C#-ProgrammierhandbuchC# Programming Guide