Udostępnij za pośrednictwem


Zaufane zestawy

Zestaw friend (ang. "friend assembly") to biblioteka, która może uzyskiwać dostęp do typów i elementów członkowskich innego zestawu oznaczonych jako internal (C#) lub Friend (Visual Basic). Jeśli dodasz atrybut zestawu do AssemblyA, aby zidentyfikować AssemblyB jako przyjazny zestaw, nie musisz już oznaczać typów i elementów członkowskich w AssemblyA jako publiczne, aby były one dostępne przez AssemblyB. 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 zestawie testowanym, które są oznaczone jako internal w języku C# lub Friend w języku Visual Basic.

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

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 / Notatka

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 zaprzyjaźnione, mogą uzyskiwać dostęp do typów i elementów członkowskich internal (C#) lub Friend (Visual Basic). Na przykład, jeśli AssemblyB jest przyjacielem Assembly A, a zestaw C odwołuje się do AssemblyB, to zestaw C nie ma dostępu do typów internal (C#) ani Friend (Visual Basic) w Assembly A.

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

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

  • StrongNameIdentityPermission dotyczy pojedynczego typu, podczas gdy zaprzyjaźnione zestawienie dotyczy 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 zaprzyjaźnionego zestawu, musisz zadeklarować relację zaprzyjaźnienia tylko raz.

  • Jeśli używasz metody StrongNameIdentityPermission, typy, które chcesz udostępnić, muszą być zadeklarowane jako publiczne. Jeśli używasz zestawu typu "friend", 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 także