InternalsVisibleToAttribute Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Určuje, že typy, které jsou obvykle viditelné pouze v rámci aktuálního sestavení, jsou viditelné pro zadané sestavení.
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
- Dědičnost
- Atributy
Příklady
Podepsaná sestavení
Následující příklad používá InternalsVisibleToAttribute atribut k vytvoření internal metody pojmenované AppendDirectorySeparator v podepsané sestavení viditelné pro jiné podepsané sestavení.
FileUtilities Definuje třídu, která obsahuje interní AppendDirectorySeparator metodu. Atribut InternalsVisibleToAttribute se použije na sestavení, které obsahuje FileUtilities třídu. Atribut umožňuje sestavení pojmenované Friend1 pro přístup k tomuto internímu členu.
//
// 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
Pokud je následující příklad zkompilován do sestavení se silným názvem s názvem Friend1, Example.Main metoda v Friend1 může úspěšně volat metodu FileUtilities.AppendDirectorySeparator , ačkoli metoda je interní pro Assembly1 sestavení. Pokud kompilujete v jazyce C# z příkazového řádku, musíte použít přepínač kompilátoru /out , abyste zajistili, že je název známého sestavení dostupný, když kompilátor vytvoří vazbu na externí odkazy.
//
// 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\
Nepodepsané sestavení
Následující příklad používá InternalsVisibleToAttribute atribut k tomu, aby internal člen unsigned sestavení viditelné pro jiné nepodepsané sestavení. Atribut zajišťuje, že internalStringLib.IsFirstLetterUpperCase metoda v sestavení s názvem UtilityLib je viditelná pro kód v sestavení s názvem Friend2. Následuje zdrojový kód pro 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
Následující příklad poskytuje zdrojový kód pro Friend2 sestavení. Všimněte si, že pokud kompilujete v jazyce C# z příkazového řádku, musíte použít přepínač kompilátoru /out , abyste zajistili, že je název přátelského sestavení dostupný, když kompilátor vytvoří vazbu na externí odkazy.
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
Poznámky
Atribut InternalsVisibleToAttribute určuje, že typy, které jsou obvykle viditelné pouze v rámci aktuálního sestavení, jsou viditelné pro zadané sestavení.
Obvykle jsou typy a členy s oboreminternal v jazyce C# nebo Friend obor v jazyce Visual Basic viditelné pouze v sestavení, ve kterém jsou definovány. Typy a členy s rozsahem protected internal (Protected Friend rozsah v jazyce Visual Basic) jsou viditelné pouze ve vlastním sestavení nebo pro typy, které jsou odvozené z jejich obsahující třídy. Typy a členy s oborem private protected (Private Protected obor v Visual Basic) jsou viditelné v obsahující třídě nebo v typech odvozených od jejich obsahující třídy v rámci aktuálního sestavení.
Atribut InternalsVisibleToAttribute zviditelňuje tyto typy a členy pro typy v zadaném sestavení, které se nazývá přátelské sestavení. To platí pouze pro členy internal (Friend v jazyce Visual Basic), protected internal (Protected Friend v jazyce Visual Basic), a private protected (Private Protected v jazyce Visual Basic), ale ne pro private.
Note
V případě private protected (Private Protected ve Visual Basicu) členů rozšiřuje atribut přístupnost pouze na typy odvozené od InternalsVisibleToAttribute.
Atribut se použije na úrovni sestavení. To znamená, že ho můžete zahrnout na začátku souboru zdrojového kódu nebo ho můžete zahrnout do souboru AssemblyInfo v projektu sady Visual Studio. Pomocí atributu můžete určit jedno přátelské sestavení, které má přístup k interním typům a členům aktuálního sestavení. Různé sestavy přátel můžete definovat dvěma způsoby. Mohou se zobrazit jako jednotlivé atributy na úrovni sestavení, jak je znázorněno v následujícím příkladu.
[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>
Mohou se také objevit s samostatnými InternalsVisibleToAttribute značkami, ale jedním assembly klíčovým slovem, jak ukazuje následující příklad.
[assembly:InternalsVisibleTo("Friend2a"),
InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
Assembly:InternalsVisibleTo("Friend2b")>
Přátelská sestavení je identifikována konstruktorem InternalsVisibleToAttribute . Aktuální sestavení i přátelská sestavení musí být nepodepsané nebo obě sestavení musí být podepsána silným názvem.
Pokud jsou obě sestavení nepodepsaná, argument assemblyName se skládá z názvu přátelského sestavení, zadaného bez cesty k adresáři nebo přípony názvu souboru.
Pokud jsou obě sestavení podepsána silným názvem, musí argument InternalsVisibleToAttribute konstruktoru obsahovat název sestavení bez jeho cesty k adresáři nebo přípony názvu souboru spolu s úplným veřejným klíčem (a ne jeho token veřejného klíče). Úplný veřejný klíč sestavení se silným názvem získáte v části Získání celého veřejného klíče dále v tomto článku. Další informace o použití InternalsVisibleToAttribute pro silně pojmenované sestavení naleznete v konstruktoru InternalsVisibleToAttribute.
Do argumentu CultureInfonezahrnujte hodnoty pro , Versionnebo ProcessorArchitecture pole; kompilátory jazyka Visual Basic, C# a C++ zachází jako s chybou kompilátoru. Pokud použijete kompilátor, který to nepovažuje za chybu (například IL Assembler (ILAsm.exe)) a sestavení mají silná jména, je vyvolána výjimka při prvním přístupu určeného přátelského sestavení k sestavení, které obsahuje atribut MethodAccessException.
Další informace o použití tohoto atributu naleznete viz Přátelská sestavení a Přátelská sestavení C++.
Získání úplného veřejného klíče
Pomocí nástroje Strong Name (Sn.exe) můžete načíst úplný veřejný klíč ze souboru se silným názvem (.snk). Provedete to takto:
Extrahujte veřejný klíč ze souboru s názvem silného klíče do samostatného souboru.
Sn -p <snk_file> <outfile>Zobrazení úplného veřejného klíče do konzoly:
Sn -tp <outfile>Zkopírujte a vložte úplnou hodnotu veřejného klíče do zdrojového kódu.
Zkompilujte spřátelené sestavení pomocí jazyka C#
Pokud použijete kompilátor jazyka C# ke kompilaci přátelského sestavení, je nutné explicitně zadat název výstupního souboru (.exe nebo .dll) pomocí volby /out kompilátoru. To je povinné, protože kompilátor ještě negeneroval název sestavení, které sestavuje v době, kdy je vázán na externí odkazy. Možnost /out kompilátoru je volitelná pro kompilátor jazyka Visual Basic a odpovídající možnost -out nebo -o kompilátoru by se neměla použít při kompilaci přátelských sestavení pomocí kompilátoru jazyka F#.
Zkompilujte přátelské sestavení pomocí jazyka C++
V jazyce C++ je nutné použít atribut InternalsVisibleToAttribute v direktivě C++, aby byly interní členy povolené atributem as_friend dostupné přátelskému sestavení. Další informace naleznete v tématu Přátelská sestavení (C++).
Konstruktory
| Name | Description |
|---|---|
| InternalsVisibleToAttribute(String) |
Inicializuje novou instanci InternalsVisibleToAttribute třídy s názvem zadaného přítele sestavení. |
Vlastnosti
| Name | Description |
|---|---|
| AllInternalsVisible |
Tato vlastnost není implementována. |
| AssemblyName |
Získá název přátelské sestavení, do kterého mají být viditelné všechny typy a členy typu, které jsou označeny klíčovým slovem |
| TypeId |
Při implementaci v odvozené třídě získá jedinečný identifikátor pro tento Attribute. (Zděděno od Attribute) |
Metody
| Name | Description |
|---|---|
| Equals(Object) |
Vrátí hodnotu, která určuje, zda je tato instance rovna zadanému objektu. (Zděděno od Attribute) |
| GetHashCode() |
Vrátí kód hash pro tuto instanci. (Zděděno od Attribute) |
| GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
| IsDefaultAttribute() |
Při přepsání v odvozené třídě určuje, zda hodnota této instance je výchozí hodnotou pro odvozenou třídu. (Zděděno od Attribute) |
| Match(Object) |
Při přepsání v odvozené třídě vrátí hodnotu, která určuje, zda se tato instance rovná zadanému objektu. (Zděděno od Attribute) |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
Explicitní implementace rozhraní
| Name | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mapuje sadu názvů na odpovídající sadu identifikátorů pro rozesílání. (Zděděno od Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Načte informace o typu objektu, který lze použít k získání informací o typu pro rozhraní. (Zděděno od Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Získá počet rozhraní typu informací, které objekt poskytuje (0 nebo 1). (Zděděno od Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Poskytuje přístup k vlastnostem a metodám vystaveným objektem. (Zděděno od Attribute) |