Compartir vía


InternalsVisibleToAttribute(String) Constructor

Definición

Inicializa una nueva instancia de la clase InternalsVisibleToAttribute con el nombre del ensamblado friend 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

Nombre de un ensamblado de confianza.

Ejemplos

ensamblados firmados

En el ejemplo siguiente se usa el atributo InternalsVisibleToAttribute para hacer que un método internal denominado AppendDirectorySeparator en un ensamblado firmado sea visible para otro ensamblado firmado. Define una clase FileUtilities que incluye un método AppendDirectorySeparator interno. El atributo InternalsVisibleToAttribute se aplica al ensamblado que contiene la clase FileUtilities. El atributo permite que un ensamblado denominado Friend1 acceda a este miembro 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

Si el ejemplo siguiente se compila en un ensamblado con nombre seguro denominado Friend1, puede llamar correctamente al método FileUtilities.AppendDirectorySeparator, aunque el método sea interno para el ensamblado de Assembly1. Tenga en cuenta que si está compilando en C# desde la línea de comandos, debe usar el modificador del compilador /out /out para asegurarse de que el nombre del ensamblado de confianza está disponible cuando el compilador se enlaza a referencias 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\

En el ejemplo siguiente se usa el atributo InternalsVisibleToAttribute para que un miembro internal de un ensamblado sin firmar sea visible para otro ensamblado sin firmar. El atributo garantiza que el método internalStringLib.IsFirstLetterUpperCase de un ensamblado denominado UtilityLib sea visible para el código de un ensamblado denominado Friend2. A continuación se muestra el código fuente de 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

ensamblados sin firmar

En el ejemplo siguiente se proporciona el código fuente del ensamblado Friend2. Tenga en cuenta que si está compilando en C# desde la línea de comandos, debe usar el modificador del compilador /out /out para asegurarse de que el nombre del ensamblado de confianza está disponible cuando el compilador se enlaza a referencias 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

Comentarios

El constructor InternalsVisibleToAttribute define un ensamblado friend, que es un ensamblado que tiene acceso a los tipos y miembros protegidos internos y privados del ensamblado actual.

Tanto el ensamblado actual como el ensamblado friend deben estar sin firmar, o ambos deben estar firmados con un nombre seguro. (Para obtener más información sobre los ensamblados con nombre seguro, vea Crear y usar ensamblados con nombre seguro). Si ambos no están firmados, el argumento assemblyName consta del nombre del ensamblado friend, especificado sin una ruta de acceso de directorio ni una extensión de archivo. Si ambos están firmados, assemblyName consta del nombre del ensamblado friend sin su ruta de acceso de directorio o extensión de nombre de archivo, junto con su clave pública completa (pero no su token de clave pública). Los demás componentes de un nombre seguro, como los que proporcionan información de referencia cultural, versión o arquitectura del procesador, no se pueden especificar en el argumento assemblyName.

Importante

Si usa el compilador de C# para compilar el ensamblado friend, debe especificar explícitamente el nombre del archivo de salida (.exe o .dll) mediante la opción del compilador / out. Esto es necesario porque el compilador aún no ha generado el nombre del ensamblado que está creando en el momento en que se enlaza a referencias externas. La opción del compilador de /out es opcional para el compilador de Visual Basic y la correspondiente o -o opción del compilador no debe usarse al compilar ensamblados de confianza con el compilador de F#.

Puede usar Sn.exe (herramienta de nombre seguro) para recuperar la clave pública completa de un archivo de clave segura (.snk). Para ello, realice los pasos siguientes:

  1. Extraiga la clave pública del archivo de clave con nombre seguro en un archivo independiente:

    Sn -psnk_file outfile

  2. Muestra la clave pública completa en la consola:

    Sn -tp outfile

  3. Copie y pegue el valor de clave pública completa en el código fuente.

Para obtener más información sobre cómo usar el atributo InternalsVisibleToAttribute, consulte los siguientes artículos:

Se aplica a