Compartilhar via


Friend Assemblies (C++)

Para o tempo de execução aplicável, o recurso de linguagem de assembly " friend torna os tipos que estão no escopo de namespace ou no escopo global em um componente do assembly acessível a um ou mais conjuntos de cliente ou.netmodules.

Qualquer tempo de execução

Comentários

(Este recurso de linguagem não é suportado em qualquer tempo de execução.)

Tempo de Execução do Windows

Comentários

(Este recurso de linguagem não é suportado em Tempo de Execução do Windows.)

ms177208.collapse_all(pt-br,VS.110).gifRequisitos

Opção de 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 de cliente ou.netmodule

  1. O componente, especifique um atributo InternalsVisibleToAttributedo assembly, e passe o nome do assembly de cliente ou.netmodule que irá acessar tipos no escopo de namespace ou no escopo global no componente.Você pode especificar os vários conjuntos de cliente ou.netmodules especificando atributos adicionais.

  2. No assembly de cliente ou.o netmodule, quando você faz referência ao assembly componente usando #using, passa o atributo de as_friend .Se você especificar o atributo de as_friend para um assembly que não especifica InternalsVisibleToAttribute, uma exceção em tempo de execução será lançada se você tentar acessar um tipo no escopo de namespace ou no escopo global no componente.

Um erro de compilação resultará se o assembly que contém o atributo de InternalsVisibleToAttribute não tem um nome forte mas o cliente que o assembly usando o atributo de as_friend faz.

Embora os tipos no namespace definir o escopo e escopo global pode ser conhecido como um assembly de cliente ou.o netmodule, acessibilidade de um membro ainda é aplicado.Por exemplo, você não pode acessar um membro particular.

Acesso a todos os tipos em um assembly deve ser explicitamente concedido.Por exemplo, o assembly que C não tem acesso à qualquer tipo no assembly A se o assembly C faz referência ao assembly B e o assembly B tem acesso à qualquer tipo no assembly A.

Para obter informações sobre como especificar a acessibilidade dos tipos fora de um assembly, consulte Visibilidade de tipo.

Para obter informações sobre como logon, que é como dar um nome forte - um para o assembly que é compilado usando o compilador do Visual C++, consulte Assemblies com nome forte (assinatura de Assembly) (C + + / CLI).

Como uma alternativa para usar assemblies recurso autorizado, você pode usar StrongNameIdentityPermission para restringir o acesso a tipos individuais.

ms177208.collapse_all(pt-br,VS.110).gifRequisitos

Opção de compilador: /clr

ms177208.collapse_all(pt-br,VS.110).gifExemplos

O exemplo de código a seguir define um componente que especifica um assembly de cliente que tenha acesso a 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 particular 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 a seguir define um componente mas não especifica um assembly de cliente que tenha acesso a tipos no componente.

Observe que o componente está associado usando /opt:noref.Isso garante que os tipos particulares são emitidas nos metadados do componente, que não é necessária quando o atributo de InternalsVisibleTo está 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 a seguir define um cliente que tentativas para acessar um particular digitem um componente que não de acesso a seus tipos particulares.Devido ao comportamento em tempo de execução, se você deseja capturar a exceção, você deve tentar acessar um particular 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 exemplo de código a seguir mostra como criar um componente de nome forte que especifica um assembly de cliente que tenha acesso a 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 sua chave pública.Sugerimos que você execute os seguintes comandos em sequência em um prompt de comando 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 particular 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