Friend-Assemblys (C++)

Bei entsprechenden Laufzeiten macht die Friend-Assembly-Sprachfunktion-Typen, die am Namespacebereich oder im globalen Gültigkeitsbereich in einer Assemblykomponente sind, die mit einem oder mehreren Clientassemblys erreichbar ist oder.netmodule.

Alle Laufzeiten

Hinweise

(Diese Sprachfunktion wird nicht in allen Laufzeiten unterstützt.)

Windows-Runtime

Hinweise

(Diese Sprachfunktion wird nicht in Windows-Runtime unterstützt.)

ms177208.collapse_all(de-de,VS.110).gifAnforderungen

Compileroption: /ZW

Common Language Runtime

Hinweise

So Typen am Namespacebereich oder im globalen Gültigkeitsbereich in einer Assemblykomponente zugänglich machen zu einer Clientassembly oder.NETMODULE kann nicht verknüpft werden.

  1. In der Komponente geben Sie ein Assemblyattribut InternalsVisibleToAttribute auf, und übergeben Sie den Namen der Clientassemblys oder.netmodule, das Zugriffstypen am Namespacebereich oder im globalen Gültigkeitsbereich in der Komponente wird.Sie können mehrere Clientassemblys oder angeben.netmodule durch Angeben von zusätzlichen Attributen.

  2. In der Clientassembly oder.netmodule, wenn Sie die Komponentenassembly verweisen, indem Sie #using verwenden, führen as_friend das Attribut.Wenn Sie das - Attribut as_friend für eine Assembly angeben, die nicht InternalsVisibleToAttribute angibt, wird eine Laufzeitausnahme ausgelöst, wenn Sie versuchen, auf einen Typ am Namespacebereich oder im globalen Gültigkeitsbereich in der Komponente zuzugreifen.

Ein Buildfehler tritt auf, wenn die Assembly, die das Attribut enthält, InternalsVisibleToAttribute keinen starken Namen jedoch den Client hat, die, Assembly, die das as_friend-Attribut verwendet, führt.

Obwohl Typen am Namespacebereich und im globalen Gültigkeitsbereich auf eine Clientassembly bekannt können oder.netmodule, Memberbarrierefreiheit ist weiterhin aktiv.Beispielsweise können Sie ein privates Member nicht verweisen.

Allen Zugriff auf Typen in einer Assembly muss explizit erteilt werden.Beispielsweise Typen, die Assembly C keinen Zugriff auf alle verfügt, Assembly A ein, wenn C-Referenz-Assembly Assembly B und Assembly B Zugriff auf alle verfügt, Assembly A einzufügen.

Informationen dazu, wie Sie die Barrierefreiheit von Typen aus einer Assembly, finden Sie unter Typsichtbarkeit angibt.

Informationen darüber, wie zu, SIGN-dass ist, wie einen starken Namen - ein zur Assembly, die erstellt wurde, indem Sie den Visual C++-Compiler verwendet, finden Sie unter Assemblys mit starken Namen (Assemblysignierung) (C++/CLI) gibt.

Als Alternative zur Verwendung der Friend-Assemblys-Funktion Sie StrongNameIdentityPermission verwenden kann, um Zugriff auf einzelne Typen zu beschränken.

ms177208.collapse_all(de-de,VS.110).gifAnforderungen

Compileroption: /clr

ms177208.collapse_all(de-de,VS.110).gifBeispiele

Im folgenden Codebeispiel wird eine Komponente, die eine Clientassembly angibt, die den Zugriff auf den Typen in der Komponente verfügt.

// friend_assemblies.cpp
// compile by using: /clr /LD
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type
[assembly:InternalsVisibleTo("friend_assemblies_2")];

ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

Im folgenden Codebeispiel greift auf ein privates in die Komponente an.

// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend

int main() {
   Class1 ^ a = gcnew Class1;
   a->Test_Public();
}

Ausgabe

Class1::Test_Public

Im folgenden Codebeispiel wird eine Komponente, gibt jedoch keine Clientassembly an, die Zugriff auf Typen in der Komponente verfügt.

Beachten Sie, dass die Komponente verknüpft ist, indem /opt:noref verwendet.Dadurch wird sichergestellt, dass private Typen in den Metadaten der Komponente ausgegeben werden, das nicht erforderlich ist, wenn das InternalsVisibleTo-Attribut vorhanden ist.Weitere Informationen finden Sie unter /OPT (Optimierungen).

// friend_assemblies_3.cpp
// compile by using: /clr /LD /link /opt:noref
using namespace System;

ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

Im folgenden Codebeispiel definiert einen Client, der versucht, um auf ein privates Zugriff auf eine Komponente eingeben, die keinen Zugriff auf seinen privaten Typen.Aufgrund des Verhaltens der Laufzeit, wenn Sie die Ausnahme abfangen möchten, müssen Sie versuchen, auf ein privates Zugriff in einer Hilfsfunktion.

// friend_assemblies_4.cpp
// compile by using: /clr
#using "friend_assemblies_3.dll" as_friend
using namespace System;

void Test() {
   Class1 ^ a = gcnew Class1;
}

int main() {
   // to catch this kind of exception, use a helper function
   try {
      Test();   
   }
   catch(MethodAccessException ^ e) {
      Console::WriteLine("caught an exception");
   }
}

Ausgabe

caught an exception

Das folgende Codebeispiel zeigt, wie eine Komponente mit starkem Namen erstellt, die eine Clientassembly angibt, die den Zugriff auf den Typen in der Komponente verfügt.

// friend_assemblies_5.cpp
// compile by using: /clr /LD /link /keyfile:friend_assemblies.snk
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type

[assembly:InternalsVisibleTo("friend_assemblies_6, PublicKey=00240000048000009400000006020000002400005253413100040000010001000bf45d77fd991f3bff0ef51af48a12d35699e04616f27ba561195a69ebd3449c345389dc9603d65be8cd1987bc7ea48bdda35ac7d57d3d82c666b7fc1a5b79836d139ef0ac8c4e715434211660f481612771a9f7059b9b742c3d8af00e01716ed4b872e6f1be0e94863eb5745224f0deaba5b137624d7049b6f2d87fba639fc5")];

private ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

Beachten Sie, dass die Komponente ihren öffentlichen Schlüssel angeben muss.Es wird empfohlen, dass Sie die folgenden Befehle sequenziell an einer Eingabeaufforderung ausführen, um ein Schlüsselpaar zu erstellen und den öffentlichen Schlüssel abzurufen:

sn -d friend_assemblies.snk

sn -k friend_assemblies.snk

sn -i friend_assemblies.snk friend_assemblies.snk

sn -pc friend_assemblies.snk key.publickey

sn -tp key.publickey

Im folgenden Codebeispiel greift auf ein privates in der Komponente mit starkem Namen zu.

// friend_assemblies_6.cpp
// compile by using: /clr /link /keyfile:friend_assemblies.snk
#using "friend_assemblies_5.dll" as_friend

int main() {
   Class1 ^ a = gcnew Class1;
   a->Test_Public();
}

Ausgabe

Class1::Test_Public

Siehe auch

Konzepte

Sprachfeatures zum Anvisieren der CLR