InternalsVisibleToAttribute Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
- 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:
Extraia a chave pública do arquivo de chave com nome forte para um arquivo separado:
Sn -p <snk_file> <outfile>Exiba a chave pública completa no console:
Sn -tp <outfile>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 |
| 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) |