Friend Assemblies (C++)
Durante o tempo de execução aplicável, o recurso de linguagem assembly de amigo torna os tipos que estão no escopo do namespace ou no escopo global em um componente do assembly acessíveis para um ou mais assemblies de cliente ou .netmodules.
Todos os Tempos de Execução
Comentários
(Esse recurso de idioma não tem suporte em todo o tempo de execução.)
Tempo de Execução do Windows
Comentários
(Esse recurso de idioma não tem suporte em Tempo de Execução do Windows.)
Requisitos
Opção do compilador: /ZW
Common Language Runtime
Comentários
Para fazer tipos no namespace definir o escopo ou no escopo global em um componente do assembly acessível a um assembly do cliente ou a um .netmodule
No componente, especifique um atributo InternalsVisibleToAttributedo assembly, e passe o nome do assembly cliente ou de .netmodule que acessarão tipos no escopo do namespace ou no escopo global no componente. Você pode especificar vários assemblies do cliente ou o .netmodules especificando atributos adicionais.
No assembly cliente ou no .netmodule, quando você referenciar o assembly componente usando #using, o atributo de as_friend . Se você especifica o atributo de as_friend para um assembly que não especifica InternalsVisibleToAttribute, uma exceção em tempo de execução será gerada se você tentar acessar um tipo no escopo do namespace ou no escopo global no componente.
Um erro de compilação ocorrerá se o assembly que contém o atributo de InternalsVisibleToAttribute não tiver um nome forte mas o cliente que o assembly que usa o atributo de as_friend faz.
Embora os tipos no namespace definir o escopo e o escopo global pode ser conhecido a um assembly do cliente ou a um .netmodule, a acessibilidade do membro ainda é aplicado. Por exemplo, você não pode acessar um membro particular.
O acesso a qualquer em um assembly deve ser explicitamente concedido. Por exemplo, o assembly que C não tem acesso a todos os tipos no assembly Para se o assembly C referencia o assembly B e o assembly B tem acesso a todos os tipos no assembly Para.
Para obter informações sobre como especificar a acessibilidade de tipos fora de um assembly, consulte Visibilidade de tipo.
Para obter informações sobre como a sinal- que é, como atribuir um nome forte do assembly que é criado usando o compilador do Visual C++, consulte Assemblies de nome forte (assinatura de assembly) (C++/CLI).
Como uma alternativa para usar assemblies recurso de amigo, você pode usar StrongNameIdentityPermission para restringir o acesso aos tipos individuais.
Requisitos
Opção do compilador: /clr
Exemplos
O exemplo de código define um componente que especifica um assembly cliente que tenha acesso aos tipos no componente.
// 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");
}
};
O exemplo de código a seguir acessa um privado no componente.
// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Saída
Class1::Test_Public
O exemplo de código seguinte define um componente mas não especifica um assembly cliente que tenha acesso aos tipos no componente.
Observe que o componente está vinculado usando /opt:noref. Isso assegura que os tipos particulares emissão nos metadados do componente, que não é necessário quando o atributo de InternalsVisibleTo estiver presente. Para obter mais informações, consulte /OPT (Otimizações).
// 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");
}
};
O exemplo de código define um cliente que as tentativas para acessar um privado digitação em um componente que não de acesso a seus tipos privados. Devido ao comportamento de tempo de execução, se você quiser capturar a exceção, você deve tentar acessar um privado em uma função auxiliar.
// 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");
}
}
Saída
caught an exception
O próximo exemplo de código mostra como criar um componente de nome forte que especifica um assembly cliente que tenha acesso aos tipos no componente.
// 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");
}
};
Observe que o componente deve especificar a chave pública. Nós sugerimos que você execute os seguintes comandos em sequência em um prompt de comando para criar um par de chaves e obter a chave pública:
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
O exemplo de código a seguir acessa um privado no componente de nome forte.
// 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();
}
Saída
Class1::Test_Public
Consulte também
Conceitos
Extensões de componente para plataformas de tempo de execução