Udostępnij za pośrednictwem


Zespoły Friend (C++)

Dla modułów wykonawczych mających zastosowanie zespoły przyjaciel funkcja języka sprawia, że typy, które znajdują się na zakres obszaru nazw lub globalne w dostępne dla jednego lub wielu zestawów klienta składnika zestawu lub.netmodules.

Czas wykonania wszystkich

Uwagi

(Ta funkcja języka nie jest obsługiwana w wszystkich modułów wykonawczych).

Środowisko wykonawcze systemu Windows

Uwagi

(Ta funkcja języka nie jest obsługiwana w Środowisko wykonawcze systemu Windows.)

ms177208.collapse_all(pl-pl,VS.110).gifWymagania

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

  1. W składniku, określ atrybut zestawu InternalsVisibleToAttributei przekazać nazwę zespołu klienta lub.netmodule, który będzie uzyskiwać dostęp do typów w zakres obszaru nazw lub globalny zakres w składniku.Można określić wielu zestawach klienta lub.netmodules określając dodatkowych atrybutów.

  2. W zestawie klient lub.netmodule, jeśli odwołujesz zgromadzenie składnika za pomocą #using, przekazać as_friend atrybut.Jeśli określisz as_friend atrybutu dla asemblowania, których nie określono InternalsVisibleToAttribute, wyjątek wykonania zostanie zgłoszony podczas próby dostępu typu w zakres obszaru nazw lub globalny zakres w składniku.

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

Mimo że typy w zakresie przestrzeni nazw i zakresie globalnym może być znany do zgromadzenia klienta lub.netmodule, Członkowskie ułatwień dostępu jest nadal obowiązują.Na przykład nie może uzyskać dostępu członek prywatny.

Dostęp 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 zgromadzenia B, a zestaw B ma dostęp do wszystkich typów w zestawie A.

Aby uzyskać informacje dotyczące sposobu określania dostępności typów spoza zestawu, zobacz Widoczność typów.

Aby uzyskać informacje na temat podpisywania — oznacza to, jak silnej nazwy, aby dać — to zespół, który jest zbudowany za pomocą kompilatora Visual C++, zobacz Silnej nazwy zestawów (podpisanie zestawu) (C + +/ CLI).

Zamiast za pomocą funkcji zestawów przyjaciela, może używać StrongNameIdentityPermission Aby ograniczyć dostęp do poszczególnych rodzajów.

ms177208.collapse_all(pl-pl,VS.110).gifWymagania

Opcja kompilatora:/clr

ms177208.collapse_all(pl-pl,VS.110).gifPrzykł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ładnik, ale nie określono zestawu klienta, które będą miały dostęp do typów w składniku.

Należy zauważyć, że składnik jest połączony za pomocą /opt:noref.Gwarantuje to, że prywatne typy są emitowane w metadane składnika, który nie jest wymagane, gdy InternalsVisibleTo atrybut jest obecny.Aby uzyskać więcej informacji, 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 klienta, który próbuje uzyskać dostęp prywatnej typu w module, który nie daje dostęp do jej prywatnego typów.Ze względu na zachowanie aparatu plików wykonywalnych Aby przechwycić tego wyjątku musi spróbujemy uzyskać dostęp do prywatnych typu w funkcji pomocnika.

// 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ć składnik silnej nazwy, 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.Zalecamy, uruchom następujące polecenia kolejno w wierszu polecenia, aby utworzyć pary kluczy i uzyskać klucz publiczny:

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

Składnik rozszerzeń dla platform Runtime