Практическое руководство. Создание неподписанных дружественных сборок (C# и Visual Basic)
В этом примере показано использование дружественных сборок с неподписанными сборками.
Для создания сборки и дружественной сборки в Visual Studio
Откройте командную строку Visual Studio.
Создайте файл Visual Basic или C# с именем friend_signed_A, содержащий следующий код.В этом коде атрибут InternalsVisibleToAttribute используется для объявления friend_signed_B в качестве дружественной сборки.
' friend_unsigned_A.vb ' Compile with: ' Vbc /target:library friend_unsigned_A.vb Imports System.Runtime.CompilerServices Imports System <Assembly: InternalsVisibleTo("friend_unsigned_B")> ' Friend type. Friend Class Class1 Public Sub Test() Console.WriteLine("Class1.Test") End Sub End Class ' Public type with Friend member. Public Class Class2 Friend Sub Test() Console.WriteLine("Class2.Test") End Sub End Class
// friend_unsigned_A.cs // Compile with: // csc /target:library friend_unsigned_A.cs using System.Runtime.CompilerServices; using System; [assembly: InternalsVisibleTo("friend_unsigned_B")] // Type is internal by default. class Class1 { public void Test() { Console.WriteLine("Class1.Test"); } } // Public type with internal member. public class Class2 { internal void Test() { Console.WriteLine("Class2.Test"); } }
Откомпилируйте и подпишите сборку friend_signed_A с помощью следующей команды.
Vbc /target:library friend_unsigned_A.vb
csc /target:library friend_unsigned_A.cs
Создайте файл Visual Basic или C# с именем friend_unsigned_B, содержащий следующий код.Поскольку файл friend_unsigned_A задает friend_unsigned_B в качестве дружественной сборки, код friend_unsigned_B может обращаться к типам и сборкам Friend (Visual Basic) или internal (C#) из friend_unsigned_A.
' friend_unsigned_B.vb ' Compile with: ' Vbc /r:friend_unsigned_A.dll friend_unsigned_B.vb Module Module1 Sub Main() ' Access a Friend type. Dim inst1 As New Class1() inst1.Test() Dim inst2 As New Class2() ' Access a Friend member of a public type. inst2.Test() System.Console.ReadLine() End Sub End Module
// friend_unsigned_B.cs // Compile with: // csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs public class Program { static void Main() { // Access an internal type. Class1 inst1 = new Class1(); inst1.Test(); Class2 inst2 = new Class2(); // Access an internal member of a public type. inst2.Test(); System.Console.ReadLine(); } }
Откомпилируйте сборку friend_signed_B с помощью следующей команды.
Vbc /r:friend_unsigned_A.dll friend_unsigned_B.vb
csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
Имя сборки, созданной компилятором, должно соответствовать имени дружественной сборки, передаваемой атрибуту InternalsVisibleToAttribute.Можно явно задать сборку, используя параметр компилятора /out.
В C# необходимо явно задавать имя выходной сборки (EXE или DLL) с помощью параметра компилятора /out.В Visual Basic это делать необязательно.Дополнительные сведения см. в разделах /out (Visual Basic) и /out (параметры компилятора C#).
Запустите файл friend_signed_B.exe.
Программа выведет две строки: "Class1.Test" и "Class2.Test".
Безопасность
Существуют сходства между атрибутом InternalsVisibleToAttribute и классом StrongNameIdentityPermission.Главное различие состоит в том, что StrongNameIdentityPermission может потребовать разрешения безопасности для выполнения определенного раздела кода, тогда как атрибут InternalsVisibleToAttribute контролирует видимость типов и членов Friend (Visual Basic) и internal (C#).
См. также
Задачи
Практическое руководство. Создание подписанных дружественных сборок (C# и Visual Basic)
Ссылки
Основные понятия
Сборки и глобальный кэш сборок (C# и Visual Basic)
Дружественные сборки (C# и Visual Basic)
Руководство по программированию на C#