Aracılığıyla paylaş


Arkadaş Derlemeler (C++)

Uygun çalışma zamanları için arkadaş derlemeleri dil özelliği, bir derleme bileşeninde ad alanı kapsamında veya genel kapsamda olan türleri bir veya daha fazla istemci derlemesi veya .netmodules tarafından erişilebilir hale getirir.

Tüm Çalışma Zamanları

Açıklamalar

(Bu dil özelliği tüm çalışma zamanlarında desteklenmez.)

Windows Çalışma Zamanı

Açıklamalar

(Bu dil özelliği Windows Çalışma Zamanı desteklenmez.)

Gereksinimler

Derleyici seçeneği: /ZW

Ortak Dil Çalışma Zamanı

Açıklamalar

Bir derleme bileşenindeki ad alanı kapsamındaki veya genel kapsamdaki türlerin istemci derlemesi veya .netmodule tarafından erişilebilir olmasını sağlamak için

  1. bileşeninde bir derleme özniteliği InternalsVisibleToAttributebelirtin ve bileşendeki ad alanı kapsamında veya genel kapsamdaki türlere erişecek istemci derlemesinin veya .netmodule'un adını geçirin. Ek öznitelikler belirterek birden çok istemci derlemesi veya .netmodule belirtebilirsiniz.

  2. İstemci derlemesinde veya .netmodule içinde, kullanarak #usingbileşen derlemesine başvurduğunda özniteliğini as_friend geçirin. belirtilmeyen InternalsVisibleToAttributebir derlemenin özniteliğini belirtirsenizas_friend, bileşendeki ad alanı kapsamında veya genel kapsamdaki bir türe erişmeye çalışırsanız bir çalışma zamanı özel durumu oluşturulur.

Özniteliğini içeren InternalsVisibleToAttribute derlemenin tanımlayıcı bir adı yoksa ancak özniteliğini kullanan as_friend istemci derlemesi varsa derleme hatası oluşur.

Ad alanı kapsamındaki ve genel kapsamdaki türler bir istemci derlemesi veya .netmodule tarafından bilinmesine rağmen, üye erişilebilirliği hala etkindir. Örneğin, özel üyeye erişemezsiniz.

Bir derlemedeki tüm türlere erişim açıkça verilmelidir. Örneğin, C derlemesi B derlemesine başvuruda bulunuyorsa ve B derlemesi A derlemesindeki tüm türlere erişime sahipse, C derlemesi A derlemesindeki tüm türlere erişimi yoktur.

Microsoft C++ derleyicisi kullanılarak oluşturulan bir derlemeyi imzalama hakkında bilgi için bkz . Tanımlayıcı Ad Derlemeleri (Derleme İmzalama) (C++/CLI).

Arkadaş derlemeleri özelliğini kullanmaya alternatif olarak, bireysel türlere erişimi kısıtlamak için kullanabilirsiniz StrongNameIdentityPermission .

Gereksinimler

Derleyici seçeneği: /clr

Örnekler

Aşağıdaki kod örneği, bileşendeki türlere erişimi olan bir istemci derlemesini belirten bir bileşeni tanımlar.

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

Sonraki kod örneği, bileşendeki özel bir türe erişir.

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

Sonraki kod örneği bir bileşeni tanımlar, ancak bileşendeki türlere erişimi olacak bir istemci derlemesi belirtmez.

Bileşenin /opt:noref kullanılarak bağlandığını fark edin. Bu, özel türlerin bileşenin meta verilerinde yayılmasını sağlar ve öznitelik mevcut olduğunda InternalsVisibleTo gerekli değildir. Daha fazla bilgi için bkz . /OPT (İyileştirmeler).

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

Aşağıdaki kod örneği, özel türlerine erişim vermeyen bir bileşende özel bir türe erişmeye çalışan bir istemciyi tanımlar. Çalışma zamanının davranışı nedeniyle, özel durumu yakalamak istiyorsanız, yardımcı işlevinde özel bir türe erişmeyi denemeniz gerekir.

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

Sonraki kod örneği, bileşendeki türlere erişimi olacak bir istemci derlemesini belirten bir tanımlayıcı ad bileşeninin nasıl oluşturulacağını gösterir.

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

Bileşenin ortak anahtarını belirtmesi gerektiğine dikkat edin. Bir anahtar çifti oluşturmak ve ortak anahtarı almak için komut isteminde aşağıdaki komutları sırayla çalıştırmanızı öneririz:

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

Sonraki kod örneği, tanımlayıcı ad bileşenindeki özel bir türe erişir.

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

Ayrıca bkz.

Çalışma Zamanı Platformları için Bileşen Uzantıları