Sestavení přítele (C++)
Pro použitelné runtimes spřátelená sestavení funkce jazyka umožňuje typy, které jsou v oboru názvů nebo globálním rozsahem v součásti sestavení, která je přístupná pro jedno nebo více sestavení klienta nebo.netmodules.
Všechny verze
Poznámky
(Tato funkce jazyka není podporována ve všech runtimes.)
Windows Runtime
Poznámky
(Tato funkce jazyk není podporován v 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 komponentu sestavení sestavení klienta nebo.netmodule
V komponentě, určete atribut sestavení 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ě.Můžete zadat více sestavení klienta nebo.Netmodules zadáním dalších atributů.
V sestavení klienta nebo.netmodule, je-li odkazovat na sestavení komponenty pomocí #using, předat as_friend atribut.Zadáte-li as_friend atribut pro sestavení, které není InternalsVisibleToAttribute, bude vyvolána výjimka za běhu, pokud při pokusu o přístup k typu v oboru názvů nebo globálním rozsahem v komponentě.
Způsobí chybu sestavení, je-li sestavení, která obsahuje InternalsVisibleToAttribute atribut nemá silný název, ale klient sestavení, které používá as_friend nemá atribut.
Ačkoli typy v oboru názvů a globálním rozsahem mohou být známa klientského sestavení nebo.netmodule, člen usnadnění je stále v platnosti.Například přístup soukromý člen.
Přístup ke všem typům v sestavení musí být explicitně uděleno.Například sestavení C nemá přístup ke všem typům v sestavení A je-li 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 usnadnění typy mimo sestavení naleznete v tématu Viditelnost typů.
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 Silný název sestavení (podpis sestavení) (C + +/ CLI).
Jako alternativu k použití funkce sestavení příteli, 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é typ 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é budou mít přístup k typům v komponentě.
Všimněte si, komponenty musí být spojena pomocí /opt:noref.Tím je zajištěno, že soukromé typy jsou emitovány v metadatech komponenty, které není nutné při InternalsVisibleTo je přítomen 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 klienta, který se pokouší o přístup k soukromé typ součásti, která neposkytují 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 součásti.
// 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, chcete-li vytvořit pár klíčů a získání veřejného klíče:
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 soukromé typu součásti silného názvu.
// 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