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

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

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

Viz také

Přípony komponent pro platformy běhového prostředí