Przyjazne zestawy (C++)
Dla modułów wykonawczych mających zastosowanie zestawy przyjaciel funkcja języka sprawia, że typy, które są w zakres obszaru nazw lub globalny zakres w składniku zestawu dostępne dla klienta zespoły lub .netmodules.
Wszystkie środowiska wykonawcze
Uwagi
(Ta funkcja języka nie jest obsługiwana w wszystkie programy obsługi).
Środowisko wykonawcze systemu Windows
Uwagi
(Ta funkcja języka nie jest obsługiwana w Środowisko wykonawcze systemu Windows.)
Wymagania
Opcja kompilatora: /ZW
Środowisko uruchomieniowe języka wspólnego
Uwagi
Aby udostępnić typów w przestrzeni nazw, zakres lub zakres globalny w składniku zestawu do montażu klienta lub .netmodule
W składniku, określ atrybut zestawu InternalsVisibleToAttributei przekazać nazwę zestawu klienta lub .netmodule, który będzie posiadał dostęp do typów w zakres obszaru nazw lub globalny zakres w składniku. Można określić wiele klienta zespoły lub .netmodules przez określenie dodatkowych atrybutów.
W zestawie klienta lub .netmodule, w przypadku odwołania zestawu składnika za pomocą #using, przekazać as_friend atrybut. Jeśli określisz as_friend atrybutu, dla których nie określono zestawu InternalsVisibleToAttribute, jeśli próby dostępu typu w zakresie obszaru nazw lub globalne w składniku zostanie wyrzucony wyjątek wykonania.
Spowoduje błąd kompilacji, jeśli zestaw, który zawiera InternalsVisibleToAttribute atrybut nie ma silnej nazwy, ale zestaw klienta, który korzysta z as_friend ma atrybut.
Chociaż może być znany typów w przestrzeni nazw i zakres globalny do montażu klienta lub .netmodule, członek ułatwień dostępu jest nadal pozostają w mocy. Na przykład nie można uzyskać dostępu członek prywatny.
Dostępu do wszystkich typów w zestawie musi być wyraźnie przyznane. Na przykład zestaw C nie ma dostępu do wszystkich typów w zestawie A Jeśli zestaw C odwołuje się do zestawu B, a zestaw B ma dostęp do wszystkich typów w zestawie A.
Aby uzyskać informacji na temat sposobu określania dostępności typów poza zestaw, zobacz Widoczność typów.
Aby uzyskać informacje o tym, jak zarejestrować — to znaczy, jak dać silnej nazwy do — to zespół, który jest zbudowany za pomocą kompilatora Visual C++, zobacz Zestawy o silnych nazwach (podpisywanie zestawów) (C++/CLI).
Zamiast za pomocą funkcji zestawów przyjaciela, może używać StrongNameIdentityPermission do ograniczania dostępu do poszczególnych typów.
Wymagania
Opcja kompilatora: /clr
Przykłady
Poniższy przykład kodu definiuje składnik, który określa zestaw klienta, który ma dostęp do typów w składniku.
// 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");
}
};
W następnym przykładzie kodu uzyskuje dostęp do prywatnych typu w składniku.
// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Dane wyjściowe
Class1::Test_Public
W następnym przykładzie kodu definiuje składnika, ale nie określa zestaw klienta, które będą miały dostęp do typów w składniku.
Należy zauważyć, że składnik jest połączone za pomocą /opt:noref.Gwarantuje to, że prywatne typy są emitowane w metadanych składnika, który nie jest wymagane przy InternalsVisibleTo atrybut jest obecny.Aby uzyskać dodatkowe informacje, zobacz /OPT (Optymalizacje).
// 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");
}
};
Poniższy przykład kodu definiuje klient, który próbuje uzyskać dostęp prywatnej typu w składnik, który nie daje dostęp do jej prywatnego typów.Ze względu na zachowanie aparatu plików wykonywalnych Chcąc wyłapania wyjątku, użytkownik musi próbują uzyskać dostęp do prywatnych typu w funkcję Pomocnik.
// 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");
}
}
Dane wyjściowe
caught an exception
Następny przykład kodu pokazuje jak utworzyć silnej nazwy składnika, który określa zestaw klienta, które będą miały dostęp do typów w składniku.
// 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");
}
};
Należy zauważyć, że składnik należy określić jego klucza publicznego.Sugerujemy, uruchom następujące polecenia kolejno w wierszu polecenia, aby utworzyć parę kluczy i klucza publicznego:
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
W następnym przykładzie kodu uzyskuje dostęp do prywatnych typu w składniku silnej nazwy.
// 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();
}
Dane wyjściowe
Class1::Test_Public
Zobacz też
Koncepcje
Funkcje języka dla określania wartości docelowej do środowiska CLR