InternalsVisibleToAttribute(String) Konstruktor
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Initialisiert eine neue Instanz der InternalsVisibleToAttribute-Klasse mit dem Namen der angegebenen Friend-Assembly.
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)
Parameter
- assemblyName
- String
Der Name einer Friend-Assembly.
Beispiele
Signierte Assemblys
Im folgenden Beispiel wird das InternalsVisibleToAttribute Attribut verwendet, um eine internal
Methode namens AppendDirectorySeparator
in einer signierten Assembly für eine andere signierte Assembly sichtbar zu machen. Es definiert eine Klasse, die eine FileUtilities
interne AppendDirectorySeparator
Methode enthält. Das InternalsVisibleToAttribute Attribut wird auf die Assembly angewendet, die die FileUtilities
Klasse enthält. Mit dem Attribut kann eine Assembly mit dem Namen Friend1
auf dieses interne Element zugreifen.
//
// 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
Wenn das folgende Beispiel in eine stark benannte Assembly mit dem Namen Friend1
kompiliert wird, kann sie die Methode erfolgreich aufrufen, auch wenn die FileUtilities.AppendDirectorySeparator
Methode intern für die Assembly1
Assembly ist. Beachten Sie, dass Wenn Sie in C# aus der Befehlszeile kompilieren, müssen Sie den / out-Compiler verwenden, um sicherzustellen, dass der Name der Freundassembly verfügbar ist, wenn der Compiler an externe Verweise gebunden wird.
//
// 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\
Im folgenden Beispiel wird das InternalsVisibleToAttribute Attribut verwendet, um ein internal
Mitglied einer nicht signierten Assembly für eine andere nicht signierte Assembly sichtbar zu machen. Das Attribut stellt sicher, dass die internal
StringLib.IsFirstLetterUpperCase
Methode in einer Assembly mit dem Namen für den Code in einer Assembly Friend2
sichtbar UtilityLib
ist. Nachfolgend sehen Sie den Quellcode für 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
Nicht signierte Assemblys
Im folgenden Beispiel wird der Quellcode für die Friend2
Assembly bereitgestellt. Beachten Sie, dass Wenn Sie in C# aus der Befehlszeile kompilieren, müssen Sie den / out-Compiler verwenden, um sicherzustellen, dass der Name der Freundassembly verfügbar ist, wenn der Compiler an externe Verweise gebunden wird.
#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
Hinweise
Der InternalsVisibleToAttribute Konstruktor definiert eine Freundassembly, die einen Zugriff auf die internen und privaten geschützten Typen und Elemente der aktuellen Assembly hat.
Sowohl die aktuelle Assembly als auch die Freundassembly müssen nicht signiert werden, oder beide müssen mit einem starken Namen signiert werden. (Weitere Informationen zu stark benannten Assemblys finden Sie unter Erstellen und Verwenden von stark benannten Assemblys.) Wenn beide nicht signiert sind, besteht das assemblyName
Argument aus dem Namen der Freundassembly, die ohne Verzeichnispfad oder Dateierweiterung angegeben ist. Wenn beide signiert sind, assemblyName
besteht aus dem Namen der Freundassembly ohne seine Verzeichnispfad- oder Dateinamenerweiterung zusammen mit seinem vollständigen öffentlichen Schlüssel (aber nicht seinem öffentlichen Schlüsseltoken). Die anderen Komponenten eines starken Namens, z. B. solche, die Kultur, Version oder Prozessorarchitekturinformationen bereitstellen, können nicht im assemblyName
Argument angegeben werden.
Wichtig
Wenn Sie den C#-Compiler zum Kompilieren der Freundassembly verwenden, müssen Sie explizit den Namen der Ausgabedatei (.exe oder .dll) mithilfe der Option /out-Compiler angeben. Dies ist erforderlich, da der Compiler den Namen für die Assembly, die er erstellt, noch nicht generiert hat, wenn er Bindungen an externe Referenzen vornimmt. Die Option "/out compiler" ist optional für den Visual Basic Compiler, und die entsprechende Option -out oder -o-Compiler sollte nicht verwendet werden, wenn Freundassemblys mit dem F#-Compiler kompiliert werden.
Sie können Sn.exe (Strong Name Tool) verwenden, um den vollständigen öffentlichen Schlüssel aus einer datei mit starkem Namen (.snk) abzurufen. Dazu führen Sie die folgenden Schritte aus:
Extrahieren Sie den öffentlichen Schlüssel aus der datei mit einem starken Namen benannten Schlüssel in eine separate Datei:
Sn -p snk_file outfile
Zeigen Sie den vollständigen öffentlichen Schlüssel für die Konsole an:
Sn - tpoutfile
Kopieren Sie den vollständigen öffentlichen Schlüsselwert in Ihren Quellcode, und fügen Sie ihn ein.
Weitere Informationen zum Verwenden des Attributs finden Sie in den InternalsVisibleToAttribute folgenden Artikeln: