InternalsVisibleToAttribute Classe

Definição

Especifica que os tipos normalmente visíveis somente dentro do assembly atual são visíveis para um assembly especificado.

public ref class InternalsVisibleToAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
public sealed class InternalsVisibleToAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)>]
type InternalsVisibleToAttribute = class
    inherit Attribute
Public NotInheritable Class InternalsVisibleToAttribute
Inherits Attribute
Herança
InternalsVisibleToAttribute
Atributos

Exemplos

Assemblies assinados

O exemplo a seguir usa o InternalsVisibleToAttribute atributo para tornar um internal método nomeado AppendDirectorySeparator em um assembly assinado visível para outro assembly assinado. Ele define uma FileUtilities classe que inclui um método interno AppendDirectorySeparator . O InternalsVisibleToAttribute atributo é aplicado ao assembly que contém a FileUtilities classe. O atributo permite que um assembly nomeado Friend1 acesse esse membro interno.

//
// The source code should be saved in a file named Example1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /t:library /keyfile:<snkfilename> Assembly1.cs
//
// The public key of the Friend1 file should be changed to the full
// public key stored in your strong-named key file.
//
using System;
using System.IO;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + 
                              "0000000602000000240000525341310004000" +
                              "001000100bf8c25fcd44838d87e245ab35bf7" +
                              "3ba2615707feea295709559b3de903fb95a93" +
                              "3d2729967c3184a97d7b84c7547cd87e435b5" +
                              "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" +
                              "712da72eec2533dc00f8529c3a0bbb4103282" +
                              "f0d894d5f34e9f0103c473dce9f4b457a5dee" +
                              "fd8f920d8681ed6dfcb0a81e96bd9b176525a" +
                              "26e0b3")]

public class FileUtilities
{
   internal static string AppendDirectorySeparator(string dir)
   {
      if (!dir.Trim().EndsWith(Path.DirectorySeparatorChar.ToString()))
         return dir.Trim() + Path.DirectorySeparatorChar;
      else
         return dir;
   }
}
'
' The source code should be saved in a file named Example1.cs. It 
' can be compiled at the command line as follows:
'
'    vbc Assembly1.vb /t:library /keyfile:<snkfilename> 
'
' The public key of the Friend1 file should be changed to the full
' public key stored in your strong-named key file.
'
Imports System.IO
Imports System.Runtime.CompilerServices

<Assembly:InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + _
                             "0000000602000000240000525341310004000" + _
                             "001000100bf8c25fcd44838d87e245ab35bf7" + _
                             "3ba2615707feea295709559b3de903fb95a93" + _
                             "3d2729967c3184a97d7b84c7547cd87e435b5" + _
                             "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" + _
                             "712da72eec2533dc00f8529c3a0bbb4103282" + _
                             "f0d894d5f34e9f0103c473dce9f4b457a5dee" + _
                             "fd8f920d8681ed6dfcb0a81e96bd9b176525a" + _
                             "26e0b3")>

Public Class FileUtilities
   Friend Shared Function AppendDirectorySeparator(dir As String) As String
      If Not dir.Trim().EndsWith(Path.DirectorySeparatorChar) Then
         Return dir.Trim() + Path.DirectorySeparatorChar
      Else
         Return dir
      End If   
   End Function
End Class

Se o exemplo a seguir for compilado em um assembly de nome forte chamado Friend1, o Example.Main método em Friend1 poderá chamar o FileUtilities.AppendDirectorySeparator método com êxito, embora o método seja interno para o Assembly1 assembly. Se você estiver compilando em C# na linha de comando, deverá usar a opção do compilador /out para garantir que o nome do assembly amigo esteja disponível quando o compilador se associar a referências externas.

//
// The source code should be saved in a file named Friend1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /r:Assembly1.dll /keyfile:<snkfilename> /out:Friend1.dll Friend1.cs
//
// The public key of the Friend1 assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
using System;

public class Example
{
   public static void Main()
   {
      string dir = @"C:\Program Files";
      dir = FileUtilities.AppendDirectorySeparator(dir);
      Console.WriteLine(dir);
   }
}
// The example displays the following output:
//       C:\Program Files\
'
' The source code should be saved in a file named Friend1.vb. It 
' can be compiled at the command line as follows:
'
'    vbc Friend1.vb /r:Assembly1.dll /keyfile:<snkfilename> 
'
' The public key of the Friend1 assembly should correspond to the public key
' specified in the class constructor of the InternalsVisibleTo attribute in the
' Assembly1 assembly.
'
Module Example
   Public Sub Main()
      Dim dir As String = "C:\Program Files"
        dir = FileUtilities1.AppendDirectorySeparator(dir)
        Console.WriteLine(dir)
   End Sub
End Module
' The example displays the following output:
'       C:\Program Files\

Assemblies não assinados

O exemplo a seguir usa o InternalsVisibleToAttribute atributo para tornar um internal membro de um assembly sem sinal visível para outro assembly não assinado. O atributo garante que o internalStringLib.IsFirstLetterUpperCase método em um assembly nomeado UtilityLib esteja visível para o código em um assembly chamado Friend2. Veja a seguir o código-fonte para UtilityLib.dll:

using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleToAttribute("Friend2")]

namespace Utilities.StringUtilities
{
   public class StringLib
   {
      internal static bool IsFirstLetterUpperCase(String s)
      {
         string first = s.Substring(0, 1);
         return first == first.ToUpper();
      }
   }
}

Imports System.Runtime.CompilerServices

<assembly: InternalsVisibleTo("Friend2")>

Namespace Utilities.StringUtilities
   Public Class StringLib
      Friend Shared Function IsFirstLetterUpperCase(s As String) As Boolean
         Dim first As String = s.Substring(0, 1)
         Return first = first.ToUpper()
      End Function
   End Class
End Namespace

O exemplo a seguir fornece o código-fonte do Friend2 assembly. Observe que, se você estiver compilando em C# na linha de comando, deverá usar a opção do compilador /out para garantir que o nome do assembly amigo esteja disponível quando o compilador se associar a referências externas.

using System;

public class Example1
{
   public static void Main()
   {
      String s = "The Sign of the Four";
      //Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s));
   }
}
Module Example1
    Public Sub Main()
        Dim s As String = "The Sign of the Four"
        ' Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s))
    End Sub
End Module

Comentários

O InternalsVisibleToAttribute atributo especifica que os tipos normalmente visíveis somente dentro do assembly atual são visíveis para um assembly especificado.

Normalmente, tipos e membros com escopo internal em C# ou Friend escopo no Visual Basic são visíveis apenas no assembly em que são definidos. Tipos e membros com protected internal escopo (Protected Friend escopo no Visual Basic) são visíveis apenas por sua própria montagem ou para tipos que derivam de sua classe que os contém. Tipos e membros com escopo private protected (escopo Private Protected em Visual Basic) são visíveis na classe que contém ou em tipos que derivam de sua classe de contenção dentro do assembly atual.

O atributo InternalsVisibleToAttribute torna esses tipos e membros visíveis também para os tipos em um assembly especificado, que é conhecido como um assembly amigável. Isso se aplica apenas a internal (Friend no Visual Basic), protected internal (Protected Friend no Visual Basic) e private protected (Private Protected no Visual Basic), mas não a private.

Note

No caso de membros private protected (Private Protected no Visual Basic), o atributo InternalsVisibleToAttribute estende a acessibilidade apenas a tipos derivados da classe de contenção do membro.

O atributo é aplicado no nível da montagem. Isso significa que ele pode ser incluído no início de um arquivo de código-fonte ou pode ser incluído no arquivo AssemblyInfo em um projeto do Visual Studio. Você pode usar o atributo para especificar um único assembly amigável que possa acessar os tipos e membros internos do assembly atual. Você pode definir vários assemblies amigáveis de duas maneiras. Eles podem aparecer como atributos individuais no nível do assembly, como ilustra o exemplo a seguir.

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

Eles também podem aparecer com tags InternalsVisibleToAttribute separadas, mas uma única assembly palavra-chave, como ilustra o exemplo a seguir.

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

O assembly amigável é identificado pelo construtor InternalsVisibleToAttribute. Tanto o assembly atual quanto o assembly amigável devem estar não assinados ou ambos os assemblies devem ser assinados com um nome forte.

Se ambos os assemblies não estiverem assinados, o assemblyName argumento consistirá no nome do assembly amigo, especificado sem um caminho de diretório ou extensão de nome de arquivo.

Caso ambos os assemblies estejam assinados com um nome forte, o argumento para o InternalsVisibleToAttribute construtor deve consistir no nome do assembly sem seu caminho de diretório ou extensão de nome de arquivo, juntamente com a chave pública completa (e não seu token de chave pública). Para obter a chave pública completa de um assembly de nome forte, consulte a seção Obter a chave pública completa mais adiante neste artigo. Para obter mais informações sobre como usar InternalsVisibleToAttribute com assemblies de nome forte, consulte o InternalsVisibleToAttribute construtor.

Não inclua valores para os campos CultureInfo, Version ou ProcessorArchitecture no argumento; os compiladores Visual Basic, C# e C++ tratam isso como um erro do compilador. Se você usar um compilador que não o trate como um erro (como o IL Assembler (ILAsm.exe)) e os assemblies forem de nome forte, uma MethodAccessException exceção será lançada na primeira vez que o assembly amigável especificado acessar o assembly que contém o InternalsVisibleToAttribute atributo.

Para obter mais informações sobre como usar esse atributo, consulte assemblies amigáveis e assemblies amigáveis em C++.

Obter a chave pública completa

Você pode usar a Ferramenta de Nome Forte (Sn.exe) para recuperar a chave pública integral de um arquivo de chave com nome forte (.snk). Para fazer isso, execute as seguintes etapas:

  1. Extraia a chave pública do arquivo de chave com nome forte para um arquivo separado:

    Sn -p <snk_file> <outfile>

  2. Exiba a chave pública completa no console:

    Sn -tp <outfile>

  3. Copie e cole o valor completo da chave pública no código-fonte.

Compilar o assembly amigável com C#

Se você usar o compilador C# para compilar o assembly amigo, deverá especificar explicitamente o nome do arquivo de saída (.exe ou .dll) usando a opção do compilador /out . Isso é necessário porque o compilador ainda não gerou o nome do assembly que está criando no momento em que está associando a referências externas. A opção do compilador /out é opcional para o compilador do Visual Basic e a opção correspondente do compilador -out ou -o não deve ser usada ao compilar assemblies amigáveis com o compilador F#.

Compilar o assembly amigável com C++

No C++, a fim de tornar os membros internos habilitados pelo atributo InternalsVisibleToAttribute acessíveis a um assembly amigo, você deve usar o atributo as_friend na diretiva C++. Para obter mais informações, consulte Assemblies amigáveis (C++).

Construtores

Nome Description
InternalsVisibleToAttribute(String)

Inicializa uma nova instância da InternalsVisibleToAttribute classe com o nome do assembly amigo especificado.

Propriedades

Nome Description
AllInternalsVisible

Essa propriedade não é implementada.

AssemblyName

Obtém o nome do assembly amigo para o qual todos os tipos e membros de tipo marcados com a internal palavra-chave devem ficar visíveis.

TypeId

Quando implementado em uma classe derivada, obtém um identificador exclusivo para esse Attribute.

(Herdado de Attribute)

Métodos

Nome Description
Equals(Object)

Retorna um valor que indica se essa instância é igual a um objeto especificado.

(Herdado de Attribute)
GetHashCode()

Retorna o código hash dessa instância.

(Herdado de Attribute)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
IsDefaultAttribute()

Quando substituído em uma classe derivada, indica se o valor dessa instância é o valor padrão para a classe derivada.

(Herdado de Attribute)
Match(Object)

Quando substituído em uma classe derivada, retorna um valor que indica se essa instância é igual a um objeto especificado.

(Herdado de Attribute)
MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Implantações explícitas de interface

Nome Description
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Mapeia um conjunto de nomes para um conjunto correspondente de identificadores de expedição.

(Herdado de Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera as informações de tipo de um objeto, que podem ser usadas para obter as informações de tipo de uma interface.

(Herdado de Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Retorna o número de interfaces de informações do tipo que um objeto fornece (0 ou 1).

(Herdado de Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornece acesso a propriedades e métodos expostos por um objeto.

(Herdado de Attribute)

Aplica-se a