Přátelská sestavení (C++)
Pro příslušné moduly runtime vytvoří přátelská funkce jazyka sestavení typy, které jsou v oboru názvů nebo v globálním oboru v komponentě sestavení přístupné pro jedno nebo více klientských sestavení nebo .netmodules.
Všechny moduly runtime
Poznámky
(Tato funkce jazyka není podporována ve všech modulech runtime.)
prostředí Windows Runtime
Poznámky
(Tato funkce jazyka není v prostředí Windows Runtime podporovaná.)
Požadavky
Možnost kompilátoru: /ZW
CLR (Common Language Runtime)
Poznámky
Nastavení typů v oboru názvů nebo v globálním oboru v komponentě sestavení přístupné pro klientské sestavení nebo .netmodule
V komponentě zadejte atribut InternalsVisibleToAttributesestavení a předejte název klientského sestavení nebo .netmodule, který bude přistupovat k typům v oboru názvů nebo globálním oboru v komponentě. Zadáním dalších atributů můžete zadat více klientských sestavení nebo .netmodules.
V klientském sestavení nebo .netmodule, pokud odkazujete na sestavení komponenty pomocí ,
#using
předejteas_friend
atribut. Pokud zadáteas_friend
atribut pro sestavení, které neurčíInternalsVisibleToAttribute
, bude vyvolán výjimka modulu runtime, pokud se pokusíte získat přístup k typu v oboru názvů nebo globální obor v komponentě.
Chyba sestavení způsobí, že sestavení, které obsahuje InternalsVisibleToAttribute atribut, nemá silný název, ale klientské sestavení, které používá as_friend
atribut.
I když typy v oboru názvů a globálním oboru můžou být známé pro klientské sestavení nebo .netmodule, přístupnost členů je stále platná. Nemůžete například získat přístup k privátnímu členu.
Přístup ke všem typům v sestavení musí být explicitně udělen. Například sestavení C nemá přístup ke všem typům v sestavení A, pokud sestavení C odkazuje na sestavení B a sestavení B má přístup ke všem typům v sestavení A.
Informace o tom, jak podepsat – to znamená, jak dát silnému názvu – sestavení vytvořené pomocí kompilátoru jazyka Microsoft C++, naleznete v tématu Sestavení silného názvu (Podepisování sestavení) (C++/CLI).
Jako alternativu k použití funkce přátelských sestavení můžete omezit StrongNameIdentityPermission přístup 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 klientské sestavení, 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 přistupuje k privátnímu typu v komponentě.
// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Class1::Test_Public
Následující příklad kódu definuje komponentu, ale nezadá sestavení klienta, které bude mít přístup k typům v komponentě.
Všimněte si, že komponenta je propojena pomocí /opt:noref. Tím se zajistí, že se privátní typy vygenerují v metadatech komponenty, které nejsou při přítomnosti atributu InternalsVisibleTo
vyžadovány. Další informace najdete 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 pokusí o přístup k privátnímu typu v komponentě, která neposkytuje přístup k jeho privátním typům. Vzhledem k chování modulu runtime, pokud chcete zachytit výjimku, musíte se pokusit o přístup k privátnímu typu v pomocné funkci.
// 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");
}
}
caught an exception
Následující příklad kódu ukazuje, jak vytvořit komponentu silného názvu, která určuje klientské sestavení, 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 komponenta musí zadat svůj veřejný klíč. Doporučujeme spustit následující příkazy postupně na příkazovém řádku, abyste vytvořili pár klíčů a získali 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 přistupuje k privátnímu typu v komponentě strong-name.
// 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();
}
Class1::Test_Public