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