Sdílet prostřednictvím


Sestavení přítele (C++)

Pro použitelné runtimes spřátelená sestavení typy, které jsou v oboru názvů nebo globálním rozsahem v součásti sestavení, která je přístupná pro sestavení klienta nebo .netmodules je funkce jazyka.

Všechny moduly runtime

Poznámky

(Tato funkce jazyka není podporována ve všech runtimes.)

prostředí Windows Runtime

Poznámky

(Tato funkce jazyk není podporován v prostředí Windows Runtime.)

Požadavky

Možnost kompilátoru: /ZW

Common Language Runtime

Poznámky

Aby typy v oboru názvů nebo globálním rozsahem v sestavení komponentu klientského sestavení nebo .netmodule

  1. V součásti zadat atribut assembly InternalsVisibleToAttributea předejte název sestavení klienta nebo .netmodule, který bude přistupovat k typy v oboru názvů nebo globálním rozsahem v komponentě. Zadáním dalších atributů můžete určit více sestavení klienta nebo .netmodules.

  2. V sestavení klienta nebo .netmodule při odkazování na sestavení komponenty pomocí #using, předat as_friend atribut. Zadáte-li as_friend pro sestavení, které neobsahuje atribut InternalsVisibleToAttribute, bude vyvolána výjimka za běhu, při pokusu o přístup na typ v oboru názvů nebo globálním rozsahem v komponentě.

Způsobí chybu sestavení, sestavení, která obsahuje-li InternalsVisibleToAttribute atribut nemá silný název, ale sestavení klienta, který používá as_friend nemá atribut.

I když typy v oboru názvů a globální rozsah může být zjištěna sestavení klienta nebo .netmodule, přístupnosti člena je stále v platnosti. Například nelze přístup soukromý člen.

Musí být výslovně udělen přístup do všech typů v sestavení. Například sestavení C nemá přístup ke všem typům v sestavení A sestavení C odkazuje na sestavení B a sestavení B má přístup ke všem typům v sestavení A.

Informace o tom, jak určit typy mimo sestavení usnadnění přístupu naleznete v tématu Typ viditelnosti.

Informace o tom, jak podepsat – to znamená, jak přiřadit silný název – sestavení, které je sestavena pomocí kompilátoru Visual C++ naleznete v tématu Sestavení se silným názvem (Podepisování sestavení) (C++/CLI).

Jako alternativu k použití funkce sestavení přítele, můžete použít StrongNameIdentityPermission k omezení přístupu k jednotlivým typům.

Požadavky

Možnost kompilátoru: /clr

Příklady

Následující příklad kódu definuje komponentu, která určuje sestavení klienta, který má přístup k typům v komponentě.

// 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");
   }
};

Následující příklad kódu získá přístup k soukromé typu součásti.

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

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

Výsledek

Class1::Test_Public

Následující příklad kódu definuje komponentu, ale neurčuje sestavení klienta, který bude mít přístup k typům v komponentě.

Všimněte si, že komponenta je spojena pomocí /opt:noref.Tím je zajištěno, že privátní typy jsou emitovány v metadatech komponenty, které není nutné při InternalsVisibleTo atribut.Další informace naleznete v tématu /OPT (optimalizace).

// 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");
   }
};

Následující příklad kódu definuje klient, který se pokouší o přístup k soukromé typ součásti, která nedává přístup k jeho soukromé typů.Protože chování modulu runtime Pokud chcete zachytit výjimky, musí pokusíte o přístup k soukromé typu ve funkci pomocníka.

// 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");
   }
}

Výsledek

caught an exception

Následující příklad kódu ukazuje, jak vytvořit silný název komponentu, která určuje sestavení klienta, který bude mít přístup k typům v komponentě.

// 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");
   }
};

Všimněte si, že komponenty, musíte zadat jeho veřejný klíč.Doporučujeme spustit následující příkazy postupně příkazového řádku k vytvoření páru klíčů a získat veřejný klíč:

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

Následující příklad kódu získá přístup k privátní typ silný název součásti.

// 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();
}

Výsledek

Class1::Test_Public

Viz také

Koncepty

Rozšíření komponent pro platformy běhového prostředí