Megosztás:


Barát összeállítások (C++)

Az alkalmazható futtatókörnyezetek esetében a barát szerelvények nyelvi funkciója lehetővé teszi, hogy a névtér vagy a globális hatókörében lévő típusok elérhetők legyenek egy vagy több kliens szerelvény vagy .netmodul számára egy szerelvény-összetevőben.

Minden futtatókörnyezet

megjegyzések

(Ez a nyelvi funkció nem támogatott minden futtatókörnyezetben.)

Windows futtatókörnyezet

megjegyzések

(Ez a nyelvi funkció a Windows futtatókörnyezetben nem támogatott.)

Követelmények

Fordító lehetőség: /ZW

Common Language Runtime (Közös Nyelvi Futásidő)

megjegyzések

A névtér vagy globális hatókörükben lévő típusok elérhetővé tétele egy szerelvény összetevőjének részeként egy ügyfélszerelvény vagy .NET modul számára.

  1. Az összetevőben adjon meg egy szerelvényattribútumot InternalsVisibleToAttribute, és adja meg annak az ügyfélszerelvénynek vagy .netmodule-nek a nevét, amely a névtér hatókörében vagy az összetevő globális hatókörében fér hozzá a típusokhoz. További attribútumok megadásával több ügyfélszerelvényt vagy .netmodult is megadhat.

  2. Az ügyfélszerelvényben vagy a .netmodule-ban, amikor #using-et használ az összetevő-szerelvényre való hivatkozáshoz, adja át az as_friend attribútumot. Ha megadja a as_friend attribútumot egy szerelvényhez, amely nincs megadva InternalsVisibleToAttribute, a rendszer futásidejű kivételt dob, ha megpróbál hozzáférni egy típushoz a névtér szintjén vagy a globális szintjén az összetevőben.

Építési hiba akkor következik be, ha az attribútumot tartalmazó InternalsVisibleToAttribute szerelvény nincs erős névvel ellátva, de az attribútumot használó as_friend ügyfélszerelvény igen.

Bár a névtér hatókörében és a globális hatókörben lévő típusok ismertek az ügyfél-assembly vagy a .netmodul számára, a tagok hozzáférhetősége továbbra is érvényben van. Például nem férhet hozzá egy privát taghoz.

A szerelvény összes típusához való hozzáférést kifejezetten meg kell adni. A C szerelvény például nem rendelkezik hozzáféréssel az A szerelvény összes típusához, ha a C szerelvény a B szerelvényre hivatkozik, a B szerelvény pedig az A szerelvény összes típusához hozzáfér.

A Microsoft C++ fordítóval létrehozott szerelvény aláírásával kapcsolatos információkért lásd: Erős névösszeállítások (szerelvény-aláírás) (C++/CLI).

Alternatív megoldásként az ismerőszerelvények funkció használata helyett StrongNameIdentityPermission használatával korlátozhatja az egyes típusokhoz való hozzáférést.

Követelmények

Fordítási lehetőség: /clr

Példák

Az alábbi példakód egy olyan összetevőt határoz meg, amely egy olyan ügyfélszerelvényt határoz meg, amely hozzáfér az összetevő típusaihoz.

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

A következő példakód egy privát típushoz fér hozzá az összetevőben.

// 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

A következő példakód egy összetevőt határoz meg, de nem ad meg olyan ügyfélszerelvényt, amely hozzáfér az összetevő típusaihoz.

Figyelje meg, hogy az összetevő az /opt:noref használatával van összekapcsolva. Ez biztosítja, hogy privát típusok legyenek kibocsátva az összetevő metaadataiban, ami nem szükséges az InternalsVisibleTo attribútum jelenlétekor. További információ: /OPT (Optimalizálás).

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

Az alábbi példakód egy olyan ügyfelet határoz meg, amely egy olyan összetevő privát típusához próbál hozzáférni, amely nem ad hozzáférést a privát típusaihoz. A futtatókörnyezet viselkedése miatt, ha el szeretné kapni a kivételt, meg kell próbálnia hozzáférni egy privát típushoz egy segédfüggvényben.

// 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

A következő példakód bemutatja, hogyan hozhat létre egy erős nevű összetevőt, amely egy olyan ügyfélszerelvényt határoz meg, amely hozzáfér az összetevő típusaihoz.

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

Figyelje meg, hogy az összetevőnek meg kell adnia a nyilvános kulcsát. Javasoljuk, hogy a következő parancsokat egymás után futtassa egy parancssorban egy kulcspár létrehozásához és a nyilvános kulcs lekéréséhez:

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

A következő példakód egy privát típushoz fér hozzá, amely az erős nevű összetevőben található.

// 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

Lásd még

Komponensbővítmények futtatókörnyezeti platformokhoz