Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uygun çalışma zamanları için 'friend assemblies' dil özelliği, bir derleme bileşeninde ad alanı kapsamında veya genel kapsamda olan türleri bir veya daha fazla istemci derlemeleri veya .netmodülleri 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
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.
İstemci derlemelerinde veya .netmodule içinde,
#usingkullanarak bileşen derlemesine başvurduğunuzda,as_friendözniteliğini geçirin.as_friendözniteliğini belirtmiş olduğunuz bir derlemedeInternalsVisibleToAttributebelirtilmemişse, bileşendeki ad alanı kapsamında veya genel kapsamdaki bir türe erişmeye çalışırken bir çalışma zamanı özel durumu oluşur.
InternalsVisibleToAttribute özniteliğini içeren derlemenin güçlü bir adı yoksa ancak as_friend özniteliğini kullanan istemci derlemesinin güçlü bir adı varsa, derleme hatası oluşur.
Ad alanı kapsamındaki ve genel kapsamdaki türler bir istemci derlemesi veya .netmodule tarafından bilinebilse de, üye erişilebilirliği hâlâ geçerlidir. Örneğin, özel üyeye erişemezsiniz.
Bir bütünlemedeki 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 derlemeye nasıl tanımlayıcı bir ad vererek imza atılacağını öğrenmek için Tanımlayıcı Ad Derlemeleri (Derleme İmzalama) (C++/CLI) kısmına bakın.
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 çıkartılmasını sağlar; fakat InternalsVisibleTo özniteliği mevcut olduğunda, bu 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, istisnayı yakalamak istiyorsanız, bir yardımcı işlevde ö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