InternalsVisibleToAttribute Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa, że typy, które są zwykle widoczne tylko w bieżącym zestawie są widoczne dla określonego zestawu.
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
- Dziedziczenie
- Atrybuty
Przykłady
Podpisane zestawy
W poniższym przykładzie użyto atrybutu InternalsVisibleToAttribute do utworzenia internal
metody o nazwie AppendDirectorySeparator
w podpisanym zestawie widocznym dla innego podpisanego zestawu. Definiuje klasę FileUtilities
, która zawiera metodę wewnętrzną AppendDirectorySeparator
. Atrybut InternalsVisibleToAttribute jest stosowany do zestawu, który zawiera klasę FileUtilities
. Atrybut umożliwia zestawowi o nazwie Friend1
dostęp do tego wewnętrznego elementu członkowskiego.
//
// 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
Jeśli poniższy przykład jest kompilowany w zestawie o silnej nazwie o nazwie Friend1
, Example.Main
metoda w Friend1
pliku może pomyślnie wywołać metodę FileUtilities.AppendDirectorySeparator
, chociaż metoda jest wewnętrzna dla Assembly1
zestawu. Pamiętaj, że w przypadku kompilowania w języku C# z wiersza polecenia należy użyć przełącznika kompilatora /out , aby upewnić się, że nazwa zestawu zaprzyjaźnionego jest dostępna, gdy kompilator wiąże się z odwołaniami zewnętrznymi.
//
// 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\
Zestawy niepodpisane
W poniższym przykładzie użyto atrybutu InternalsVisibleToAttribute , aby element internal
członkowski niepodpisanego zestawu był widoczny dla innego niepodpisanego zestawu. Atrybut zapewnia, że internal
StringLib.IsFirstLetterUpperCase
metoda w zestawie o nazwie UtilityLib
jest widoczna dla kodu w zestawie o nazwie Friend2
. Poniżej przedstawiono kod źródłowy 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
Poniższy przykład zawiera kod źródłowy zestawu Friend2
. Pamiętaj, że w przypadku kompilowania w języku C# z wiersza polecenia należy użyć przełącznika kompilatora /out , aby upewnić się, że nazwa zestawu zaprzyjaźnionego jest dostępna, gdy kompilator wiąże się z odwołaniami zewnętrznymi.
#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
Uwagi
Zwykle typy i elementy członkowskie z zakreseminternal
w języku C# lub Friend
zakres w Visual Basic są widoczne tylko w zestawie, w którym są zdefiniowane. Typy i składowe z zakresem protected internal
(Protected Friend
zakres w Visual Basic) są widoczne tylko w ich własnym zestawie lub typach, które pochodzą z ich zawierającej klasę. Typy i składowe z zakresem private protected
(Private Protected
zakres w Visual Basic) są widoczne w zawierającej klasy lub w typach, które pochodzą z ich zawierającej klasę w bieżącym zestawie
Atrybut InternalsVisibleToAttribute sprawia, że te typy i elementy członkowskie są również widoczne dla typów w określonym zestawie, który jest znany jako zestaw zaprzyjaźniony. Dotyczy to tylko internal
elementów członkowskich (Friend
w Visual Basic), protected internal
(Protected Friend
w Visual Basic) i private protected
(Private Protected
w Visual Basic), ale nie private
tych.
Uwaga
W przypadku private protected
elementów członkowskich (Private Protected
w Visual Basic) InternalsVisibleToAttribute atrybut rozszerza ułatwienia dostępu tylko do typów, które pochodzą z zawierającej klasy składowej.
Atrybut jest stosowany na poziomie zestawu. Oznacza to, że może on zostać uwzględniony na początku pliku kodu źródłowego lub może zostać uwzględniony w pliku AssemblyInfo w projekcie Visual Studio. Można użyć atrybutu , aby określić jeden zestaw zaprzyjaźniony, który może uzyskać dostęp do typów wewnętrznych i składowych bieżącego zestawu. Można zdefiniować wiele przyjaznych zestawów na dwa sposoby. Mogą być wyświetlane jako poszczególne atrybuty na poziomie zestawu, jak pokazano w poniższym przykładzie.
[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>
Mogą również być wyświetlane z oddzielnymi InternalsVisibleToAttribute tagami, ale pojedynczym assembly
słowem kluczowym, jak pokazano w poniższym przykładzie.
[assembly:InternalsVisibleTo("Friend2a"),
InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
Assembly:InternalsVisibleTo("Friend2b")>
Zestaw zaprzyjaźniony jest identyfikowany przez InternalsVisibleToAttribute konstruktora. Zarówno obecny zestaw, jak i zestaw zaprzyjaźniony muszą być niepodpisane lub oba zestawy muszą być podpisane silną nazwą.
Jeśli oba zestawy są niepodpisane, assemblyName
argument składa się z nazwy zestawu zaprzyjaźnionego, określonego bez ścieżki katalogu lub rozszerzenia nazwy pliku.
Jeśli oba zestawy są podpisane za pomocą silnej nazwy, argument InternalsVisibleToAttribute konstruktora musi składać się z nazwy zestawu bez ścieżki katalogu lub rozszerzenia nazwy pliku wraz z pełnym kluczem publicznym (a nie tokenem klucza publicznego). Aby uzyskać pełny klucz publiczny zestawu o silnej nazwie, zobacz sekcję Pobieranie pełnego klucza publicznego w dalszej części tego artykułu. Aby uzyskać więcej informacji na temat używania z InternalsVisibleToAttribute zestawami o silnych nazwach, zobacz InternalsVisibleToAttribute konstruktor.
Nie dołączaj wartości dla CultureInfopola , Versionlub ProcessorArchitecture w argumencie; kompilatory Visual Basic, C# i C++ traktują to jako błąd kompilatora. Jeśli używasz kompilatora, który nie traktuje go jako błędu (takiego jak asembler IL (ILAsm.exe)), a zestawy są silnie nazwane, MethodAccessException wyjątek jest zgłaszany po raz pierwszy, gdy określony zestaw zaprzyjaźniony uzyskuje dostęp do zestawu zawierającego InternalsVisibleToAttribute atrybut .
Aby uzyskać więcej informacji na temat używania tego atrybutu, zobacz Friend assemblies and C++ friend assemblies (Zestawy znajome języka C++).
Pobieranie pełnego klucza publicznego
Za pomocą narzędzia strong name tool (Sn.exe) można pobrać pełny klucz publiczny z pliku klucza o silnych nazwach (snk). W tym celu należy wykonać następujące czynności:
Wyodrębnij klucz publiczny z pliku klucza o silnej nazwie do oddzielnego pliku:
Sn -p snk_file plik outfile
Wyświetl pełny klucz publiczny w konsoli:
Sn - tpoutfile
Skopiuj i wklej pełną wartość klucza publicznego do kodu źródłowego.
Kompilowanie zestawu zaprzyjaźnionego za pomocą języka C
Jeśli kompilator języka C# jest używany do kompilowania zestawu zaprzyjaźnionego, należy jawnie określić nazwę pliku wyjściowego (.exe lub .dll) przy użyciu opcji /out kompilatora. Jest to wymagane, ponieważ kompilator nie wygenerował jeszcze nazwy zestawu, który kompiluje w momencie powiązania z odwołaniami zewnętrznymi. Opcja /out kompilatora jest opcjonalna dla kompilatora Visual Basic, a odpowiednia opcja kompilatora -out lub -o nie powinna być używana podczas kompilowania przyjaznych zestawów za pomocą kompilatora języka F#.
Kompilowanie przyjaznego zestawu przy użyciu języka C++
W języku C++, aby umożliwić członkom wewnętrznym włączenie przez InternalsVisibleToAttribute atrybut dostępny dla zestawu zaprzyjaźnionego, należy użyć atrybutu as_friend
w dyrektywie C++. Aby uzyskać więcej informacji, zobacz Friend Assemblies (C++).
Konstruktory
InternalsVisibleToAttribute(String) |
Inicjuje InternalsVisibleToAttribute nowe wystąpienie klasy o nazwie określonego zestawu zaprzyjaźnionego. |
Właściwości
AllInternalsVisible |
Ta właściwość nie jest zaimplementowana. |
AssemblyName |
Pobiera nazwę zestawu zaprzyjaźnionego, do którego mają być widoczne wszystkie typy i składowe typu oznaczone |
TypeId |
Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego Attributeelementu . (Odziedziczone po Attribute) |
Metody
Equals(Object) |
Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi. (Odziedziczone po Attribute) |
GetHashCode() |
Zwraca wartość skrótu dla tego wystąpienia. (Odziedziczone po Attribute) |
GetType() |
Type Pobiera wartość bieżącego wystąpienia. (Odziedziczone po Object) |
IsDefaultAttribute() |
W przypadku zastąpienia w klasie pochodnej wskazuje, czy wartość tego wystąpienia jest wartością domyślną klasy pochodnej. (Odziedziczone po Attribute) |
Match(Object) |
Po przesłonięciu w klasie pochodnej zwraca wartość wskazującą, czy to wystąpienie jest równe określonemu obiektowi. (Odziedziczone po Attribute) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Jawne implementacje interfejsu
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Zestaw nazw jest mapowany na odpowiedni zestaw identyfikatorów wysyłania. (Odziedziczone po Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Pobiera informacje o typie dla obiektu, który może służyć do pobierania informacji o typie dla interfejsu. (Odziedziczone po Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Pobiera informację o liczbie typów interfejsów, jakie zawiera obiekt (0 lub 1). (Odziedziczone po Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Umożliwia dostęp do właściwości i metod udostępnianych przez obiekt. (Odziedziczone po Attribute) |