Przyjazne zestawy

Zestaw znajomy to zestaw, który może uzyskiwać dostęp do wewnętrznych (C#) lub friend (Visual Basic) typów i elementów członkowskich innego zestawu. Jeśli dodasz atrybut zestawu do zestawu AssemblyA , aby zidentyfikować ZestawB jako przyjazny zestaw, nie musisz już oznaczać typów i elementów członkowskich w AssemblyA jako publicznej, aby były one dostępne przez ZestawB. Jest to szczególnie wygodne w następujących scenariuszach:

  • Podczas testowania jednostkowego, gdy kod testowy jest uruchamiany w osobnym zestawie, ale wymaga dostępu do elementów członkowskich w teście testowanym, które są oznaczone jako internal w języku C# lub Friend Visual Basic.

  • Podczas tworzenia biblioteki klas i dodatków do biblioteki znajdują się w osobnych zestawach, ale wymagają dostępu do składowych w istniejących zestawach oznaczonych jako internal w języku C# lub Friend Visual Basic.

Uwagi

Atrybutu InternalsVisibleToAttribute można użyć do identyfikowania co najmniej jednego zestawu zaprzyjaźnionego dla danego zestawu. W poniższym przykładzie użyto atrybutu InternalsVisibleToAttributeAssemblyA i określono zestaw assemblyB jako przyjazny zestaw. Zapewnia to zestawowiB dostęp do wszystkich typów i elementów członkowskich w zestawie A , które są oznaczone jako internal w języku C# lub Friend Visual Basic.

Uwaga

Podczas kompilowania zestawu takiego jak AssemblyB , który będzie uzyskiwać dostęp do typów wewnętrznych lub wewnętrznych elementów członkowskich innego zestawu, takiego jak AssemblyA, 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. Aby uzyskać więcej informacji, zobacz OutputAssembly (C#) lub -out (Visual Basic).

using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default.
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method.
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}
Imports System.Runtime.CompilerServices
<Assembly: InternalsVisibleTo("AssemblyB")>

' Friend class.
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub
End Class

Tylko zestawy, które jawnie określisz jako znajomi, mogą uzyskiwać dostęp do internal typów i elementów członkowskich (C#) lub Friend (Visual Basic). Jeśli na przykład AssemblyB jest przyjacielem zestawów A i Zestaw C odwołuje się do zestawu B, zestaw C nie ma dostępu do internal typów (C#) ani Friend (Visual Basic) w zestawie A.

Kompilator wykonuje podstawową walidację nazwy zestawu znajomego przekazanego do atrybutu InternalsVisibleToAttribute . Jeśli zestaw A deklaruje AssemblyB jako zestaw przyjazny, reguły walidacji są następujące:

  • Jeśli zestaw A ma silną nazwę, funkcja AssemblyB musi również mieć silną nazwę. Przyjazna nazwa zestawu przekazywana do atrybutu musi składać się z nazwy zestawu i klucza publicznego klucza silnej nazwy używanego do podpisywania zestawuB.

    Przyjazna nazwa zestawu przekazywana do atrybutu InternalsVisibleToAttribute nie może być silną nazwą zestawuB. Nie dołączaj wersji zestawu, kultury, architektury ani tokenu klucza publicznego.

  • Jeśli nazwa zestawu A nie jest silna, przyjazna nazwa zestawu powinna składać się tylko z nazwy zestawu. Aby uzyskać więcej informacji, zobacz How to: Create unsigned friend assemblies (Instrukcje: tworzenie zestawów niepodpisanych znajomych).

  • Jeśli parametr AssemblyB ma silną nazwę, należy określić klucz silnej nazwy dla zestawuB przy użyciu ustawienia projektu lub opcji kompilatora wiersza polecenia /keyfile . Aby uzyskać więcej informacji, zobacz How to: Create signed friend assemblies (Instrukcje: tworzenie podpisanych zestawów zaprzyjaźnionych).

Klasa StrongNameIdentityPermission zapewnia również możliwość udostępniania typów z następującymi różnicami:

  • StrongNameIdentityPermission dotyczy pojedynczego typu, podczas gdy zestaw znajomy ma zastosowanie do całego zestawu.

  • Jeśli w zestawie A istnieją setki typów, które chcesz udostępnić zestawowiB, musisz dodać StrongNameIdentityPermission je do wszystkich. Jeśli używasz znajomego zestawu, musisz zadeklarować tylko raz relację przyjaciela.

  • Jeśli używasz metody StrongNameIdentityPermission, typy, które chcesz udostępnić, muszą być zadeklarowane jako publiczne. Jeśli używasz zestawu znajomego, udostępnione typy są deklarowane jako internal (C#) lub Friend (Visual Basic).

Aby uzyskać informacje na temat uzyskiwania dostępu do typów i metod zestawu internal (C#) lub Friend (Visual Basic) z pliku modułu (pliku z rozszerzeniem .netmodule ), zobacz ModuleAssemblyName (C#) lub -moduleassemblyname (Visual Basic).

Zobacz też