如何:创建签名的友元程序集
更新:2007 年 11 月
本示例演示了如何将友元程序集和具有强名称的程序集一起使用。这两种程序集必须都使用强名称。尽管本示例中的两种程序集使用了相同的密钥,但您可以对这两种程序集使用不同的密钥。
在 Visual Studio 中创建签名的程序集和友元程序集
打开 Visual Studio 命令提示。
使用强名称工具,通过以下命令序列生成 keyfile 并显示其公钥。有关更多信息,请参见强名称工具 (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 文件,名为 FriendAssembliesSnA.vb 并包含以下代码。该代码使用 InternalsVisibleToAttribute 属性声明 FriendAssembliesSnB 为友元程序集。
强名称工具在每次运行时生成新的公钥。因此,必须将以下代码中的公钥替换为刚生成的公钥,如下例所示。
' FriendAssembliesSnA.vb. ' Compile with: ' Vbc.exe /target:library /keyfile:FriendAssemblies.snk FriendAssembliesSnA.vb Imports System.Runtime.CompilerServices ' Replace the value of PublicKey with your public key. <Assembly: InternalsVisibleTo("FriendAssembliesSnB, PublicKey=" & _ "002400000480000094000000060200000024000052534131000400000100010065364c" & _ "640a04ab7c4f06313779601ffb5d1284b381393ad2ede92b4bf91384bbfdb0f9b7ecf6" & _ "a387b7f9348fc59366987429db41ee061c1a808eb408c4ebd9aebd0d4b19b721121a0d" & _ "c66949f12878c4e2add5489f6208f49e67ddee4d0bb72fa6860a775b7e2232209efe8b" & _ "4566ea8bd9319a4b8feb3ef4911e7a7d2e957a92")> ' Friend class. Friend Class FriendAssembliesSnA Public Sub Test() MsgBox("Friend Assemblies Sample") End Sub End Class
编译 FriendAssembliesSnA.vb 并对其签名:
Vbc.exe /target:library /keyfile:FriendAssemblies.snk FriendAssembliesSnA.vb
创建一个新 Visual Basic 文件,名为 FriendAssembliesSnB.vb 并包含以下代码。因为 FriendAssembliesSnA 已指定 FriendAssembliesSnB 为友元程序集,所以 FriendAssembliesSnB 中的代码可以访问 FriendAssembliesSnA 中的 Friend 类型和成员。
' FriendAssembliesSnB.vb. ' Compile with: ' Vbc.exe /keyfile:FriendAssemblies.snk /r:FriendAssembliesSnA.dll FriendAssembliesSnB.vb Module FriendAssembliesSnB Public Sub Main() ' Access a Friend class. Dim friendTest As New FriendAssembliesSnA friendTest.Test() End Sub End Module
编译 FriendAssembliesSnB.vb 并对其签名:
Vbc.exe /keyfile:FriendAssemblies.snk /r:FriendAssembliesSnA.dll FriendAssembliesSnB.vb
编译器生成的程序集的名称必须与传递给 InternalsVisibleToAttribute 属性的友元程序集的名称匹配。可以使用 /out 编译器选项显式设置该程序集。有关更多信息,请参见/out (Visual Basic)。
运行 FriendAssembliesSnB.exe。
该程序将显示一个消息框,其中包含字符串“Friend Assemblies Sample”。
安全性
InternalsVisibleToAttribute 属性和 StrongNameIdentityPermission 类之间存在相似性。主要的差异在于:StrongNameIdentityPermission 可以要求具有安全权限才能运行特定的一段代码,而 InternalsVisibleToAttribute 属性则控制 Friend 类型和成员的可见性。