Sestavení přítele (C++)

Pro použitelné runtimes spřátelená sestavení funkce jazyka umožňuje typy, které jsou v oboru názvů nebo globálním rozsahem v součásti sestavení, která je přístupná pro jedno nebo více sestavení klienta nebo.netmodules.

Všechny verze

Poznámky

(Tato funkce jazyka není podporována ve všech runtimes.)

Windows Runtime

Poznámky

(Tato funkce jazyk není podporován v Windows Runtime.)

ms177208.collapse_all(cs-cz,VS.110).gifPožadavky

Možnost kompilátoru:/ZW

Common Language Runtime

Poznámky

Aby typy v oboru názvů nebo globálním rozsahem v komponentu sestavení sestavení klienta nebo.netmodule

  1. V komponentě, určete atribut sestavení InternalsVisibleToAttributea předejte název sestavení klienta nebo.netmodule, který bude přistupovat k typy v oboru názvů nebo globálním rozsahem v komponentě.Můžete zadat více sestavení klienta nebo.Netmodules zadáním dalších atributů.

  2. V sestavení klienta nebo.netmodule, je-li odkazovat na sestavení komponenty pomocí #using, předat as_friend atribut.Zadáte-li as_friend atribut pro sestavení, které není InternalsVisibleToAttribute, bude vyvolána výjimka za běhu, pokud při pokusu o přístup k typu v oboru názvů nebo globálním rozsahem v komponentě.

Způsobí chybu sestavení, je-li sestavení, která obsahuje InternalsVisibleToAttribute atribut nemá silný název, ale klient sestavení, které používá as_friend nemá atribut.

Ačkoli typy v oboru názvů a globálním rozsahem mohou být známa klientského sestavení nebo.netmodule, člen usnadnění je stále v platnosti.Například přístup soukromý člen.

Přístup ke všem typům v sestavení musí být explicitně uděleno.Například sestavení C nemá přístup ke všem typům v sestavení A je-li sestavení C odkazuje na sestavení B a sestavení B má přístup ke všem typům v sestavení A.

Informace o tom, jak určit usnadnění typy mimo sestavení naleznete v tématu Viditelnost typů.

Informace o tom, jak podepsat – to znamená, jak přiřadit silný název – sestavení, které je sestavena pomocí kompilátoru Visual C++ naleznete v tématu Silný název sestavení (podpis sestavení) (C + +/ CLI).

Jako alternativu k použití funkce sestavení příteli, můžete použít StrongNameIdentityPermission k omezení přístupu k jednotlivým typům.

ms177208.collapse_all(cs-cz,VS.110).gifPožadavky

Možnost kompilátoru:/clr

ms177208.collapse_all(cs-cz,VS.110).gifPříklady

Následující příklad kódu definuje komponentu, která určuje sestavení klienta, 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 získá přístup k soukromé typ součásti.

// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend

int main() {
   Class1 ^ a = gcnew Class1;
   a->Test_Public();
}

Výsledek

Class1::Test_Public

Následující příklad kódu definuje komponentu, ale neurčuje sestavení klienta, které budou mít přístup k typům v komponentě.

Všimněte si, komponenty musí být spojena pomocí /opt:noref.Tím je zajištěno, že soukromé typy jsou emitovány v metadatech komponenty, které není nutné při InternalsVisibleTo je přítomen atribut.Další informace naleznete 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 pokouší o přístup k soukromé typ součásti, která neposkytují přístup k jeho soukromé typů.Protože chování modulu runtime Pokud chcete zachytit výjimky, musí pokusíte o přístup k soukromé typu ve funkci pomocníka.

// 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");
   }
}

Výsledek

caught an exception

Následující příklad kódu ukazuje, jak vytvořit silný název komponentu, která určuje sestavení klienta, který bude mít přístup k typům v součásti.

// 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 komponenty musíte zadat jeho veřejný klíč.Doporučujeme spustit následující příkazy postupně příkazového řádku, chcete-li vytvořit pár klíčů a získání veřejného klíče:

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 získá přístup k soukromé typu součásti silného názvu.

// 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();
}

Výsledek

Class1::Test_Public

Viz také

Koncepty

Součást rozšíření pro Runtime platformy