Практическое руководство. Создание подписанных дружественных сборок (C# и Visual Basic)
В этом примере показано использование дружественных сборок со сборками, имеющими строгие имена. Обе сборки должны иметь строгие имена. Хотя обе сборки этого примера используют одинаковые ключи, для двух сборок можно использовать различные ключи.
Для создания подписанной и дружественной сборок в Visual Studio
Откройте командную строку Visual Studio.
Используйте следующую последовательность команд в средстве строгих имен для формирования файла ключа и отображения его открытого ключа. Дополнительные сведения см. в разделе Sn.exe (средство строгих имен).
Создайте ключ для строгого имени этого примера и сохраните его в файле FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Извлеките открытый ключ из FriendAssemblies.snk и поместите его в FriendAssemblies.publickey:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Отобразите открытый ключ, сохраненный в файле FriendAssemblies.publickey:
sn -tp FriendAssemblies.publickey
Создайте файл Visual Basic или C# с именем friend_signed_A, содержащий следующий код. В этом коде атрибут InternalsVisibleToAttribute используется для объявления friend_signed_B в качестве дружественной сборки.
Средство строгих имен создает новый открытый ключ его при каждом запуске. Таким образом, необходимо заменить открытый ключ следующего кода на только что созданный открытый ключ, как показано в следующем примере.
' friend_signed_A.vb ' Compile with: ' Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb Imports System.Runtime.CompilerServices <Assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")> Public Class Class1 Public Sub Test() System.Console.WriteLine("Class1.Test") System.Console.ReadLine() End Sub End Class
// friend_signed_A.cs // Compile with: // csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")] class Class1 { public void Test() { System.Console.WriteLine("Class1.Test"); System.Console.ReadLine(); } }
Откомпилируйте и подпишите сборку friend_signed_A с помощью следующей команды.
Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Создайте файл Visual Basic или C# с именем friend_signed_B, содержащий следующий код. Поскольку файл friend_signed_A задает friend_signed_B в качестве дружественной сборки, код friend_signed_B может обращаться к типам и сборкам Friend (Visual Basic) или internal (C#) из friend_signed_A. Файл содержит следующий код.
' friend_signed_B.vb ' Compile with: ' Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb Module Sample Public Sub Main() Dim inst As New Class1 inst.Test() End Sub End Module
// friend_signed_B.cs // Compile with: // csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs public class Program { static void Main() { Class1 inst = new Class1(); inst.Test(); } }
Откомпилируйте и подпишите сборку friend_signed_B с помощью следующей команды.
Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb
csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
Имя сборки, созданной компилятором, должно соответствовать имени дружественной сборки, передаваемой атрибуту InternalsVisibleToAttribute. Можно явно задать сборку, используя параметр компилятора /out.
В C# необходимо явно задавать имя выходной сборки (EXE или DLL) с помощью параметра компилятора /out. В Visual Basic это делать необязательно. Дополнительные сведения см. в разделах /out (Visual Basic) и /out (параметры компилятора C#).
Запустите файл friend_signed_B.exe.
Программа выведет строку "Class1.Test".
Безопасность
Существуют сходства между атрибутом InternalsVisibleToAttribute и классом StrongNameIdentityPermission. Главное различие состоит в том, что StrongNameIdentityPermission может потребовать разрешения безопасности для выполнения определенного раздела кода, тогда как атрибут InternalsVisibleToAttribute контролирует видимость типов и членов Friend (Visual Basic) и internal (C#).
См. также
Задачи
Практическое руководство. Создание неподписанных дружественных сборок (C# и Visual Basic)
Ссылки
Sn.exe (средство строгих имен)
Основные понятия
Сборки и глобальный кэш сборок (C# и Visual Basic)
Дружественные сборки (C# и Visual Basic)
Создание и использование сборок со строгими именами
Руководство по программированию на C#