Sdílet prostřednictvím


Přátelská sestavení (C++)

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

  1. 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ů.

  2. V klientském sestavení nebo .netmodule, když odkazujete na sestavení komponenty pomocí #using, předejte atribut as_friend. Pokud zadáte as_friend atribut 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

Viz také

Přípony komponent pro běhové platformy