InternalsVisibleToAttribute(String) Construtor
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.
Inicializa uma nova instância da classe InternalsVisibleToAttribute com o nome do assembly amigável especificado.
public:
InternalsVisibleToAttribute(System::String ^ assemblyName);
public InternalsVisibleToAttribute (string assemblyName);
new System.Runtime.CompilerServices.InternalsVisibleToAttribute : string -> System.Runtime.CompilerServices.InternalsVisibleToAttribute
Public Sub New (assemblyName As String)
Parâmetros
- assemblyName
- String
O nome de um assembly amigável.
Exemplos
Assemblies assinados
O exemplo a seguir usa o InternalsVisibleToAttribute atributo para tornar um internal
método chamado 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 chamado 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
, ele poderá chamar o FileUtilities.AppendDirectorySeparator
método com êxito, mesmo que o método seja interno para o Assembly1
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 amigável esteja disponível quando o compilador se associar a referências externas.
//
// The assembly that exposes its internal types to this assembly should be
// named Assembly1.dll.
//
// The public key of this assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
#using <Assembly1.dll> as_friend
using namespace System;
void main()
{
String^ dir = L"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.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 = FileUtilities.AppendDirectorySeparator(dir)
Console.WriteLine(dir)
End Sub
End Module
' The example displays the following output:
' C:\Program Files\
O exemplo a seguir usa o InternalsVisibleToAttribute atributo para tornar internal
um membro de um assembly sem sinal visível para outro assembly não assinado. O atributo garante que o internal
StringLib.IsFirstLetterUpperCase
método em um assembly chamado 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
Assemblies não assinados
O exemplo a seguir fornece o código-fonte para o 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 amigável esteja disponível quando o compilador se associar a referências externas.
#using <UtilityLib.dll> as_friend
using namespace System;
using namespace Utilities::StringUtilities;
void main()
{
String^ s = "The Sign of the Four";
Console::WriteLine(StringLib::IsFirstLetterUpperCase(s));
}
using System;
using Utilities.StringUtilities;
public class Example
{
public static void Main()
{
String s = "The Sign of the Four";
Console.WriteLine(StringLib.IsFirstLetterUpperCase(s));
}
}
Imports Utilities.StringUtilities
Module Example
Public Sub Main()
Dim s As String = "The Sign of the Four"
Console.WriteLine(StringLib.IsFirstLetterUpperCase(s))
End Sub
End Module
Comentários
O InternalsVisibleToAttribute construtor define um assembly amigável, que é um assembly que tem acesso aos tipos e membros protegidos internos e privados do assembly atual.
O assembly atual e o assembly amigável devem estar sem sinal ou ambos devem ser assinados com um nome forte. (Para obter mais informações sobre assemblies de nome forte, consulte Create e use assemblies de nome forte.) Se ambos não estiverem assinados, o assemblyName
argumento consistirá no nome do assembly amigável, especificado sem um caminho de diretório ou extensão de arquivo. Se ambos forem assinados, assemblyName
consistirá no nome do assembly amigável sem seu caminho de diretório ou extensão de nome de arquivo, juntamente com sua chave pública completa (mas não seu token de chave pública). Os outros componentes de um nome forte, como aqueles que fornecem informações de cultura, versão ou arquitetura do processador, não podem ser especificados no assemblyName
argumento .
Importante
Se você usar o compilador C# para compilar o assembly amigável, 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á compilando no momento em que ele está se associando às referências externas. A opção do compilador /out é opcional para o compilador do Visual Basic e a opção do compilador -out ou -o correspondente não deve ser usada ao compilar assemblies amigáveis com o compilador F#.
Você pode usar Sn.exe (Strong Name Tool) para recuperar a chave pública completa de um arquivo de chave de nome forte (.snk). Para fazer isso, execute as seguintes etapas:
Extraia a chave pública do arquivo de chave de nome forte para um arquivo separado:
Sn -psnk_fileoutfile
Exiba a chave pública completa no console:
Sn -tpoutfile
Copie e cole o valor completo da chave pública no código-fonte.
Para obter mais informações sobre como usar o InternalsVisibleToAttribute atributo , consulte os seguintes artigos:
Aplica-se a
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de