Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce jazyka přátelská sestavení pro příslušné runtime umožňuje, aby byly typy ve jmenném nebo globálním oboru názvů v komponentě sestavení přístupné pro jedno nebo více klientských sestavení nebo .netmodules.
Všechny moduly runtime
Poznámky
(Tato jazyková funkce není podporována ve všech prostředích 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 (Společné jazykové prostředí)
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 sestavení InternalsVisibleToAttribute a předejte název klientského sestavení nebo .netmodulu, které budou přistupovat k typům v oboru názvů nebo globálním oboru komponenty. Zadáním dalších atributů můžete určit více klientských sestavení nebo netmodulů.
V klientském sestavení nebo .netmodule, když odkazujete na sestavení komponenty pomocí
#using, předejte atributas_friend. Pokud zadáteas_friendatribut pro sestavení, které neurčíInternalsVisibleToAttribute, bude vyvolána výjimka za běhu, pokud se pokusíte získat přístup k typu v oboru názvů nebo globálním oboru v komponentě.
Chyba sestavení nastane, pokud sestavení, které obsahuje atribut InternalsVisibleToAttribute, nemá silný název, zatímco klientské sestavení, které používá atribut as_friend, tento silný název má.
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ů zůstává 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í běhového prostředí, pokud chcete zachytit výjimku, musíte se pokusit o přístup k soukromé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