如何:创建签名的友元程序集

更新:2007 年 11 月

本示例演示了如何将友元程序集和具有强名称的程序集一起使用。这两种程序集必须都使用强名称。尽管本示例中的两种程序集使用了相同的密钥,但您可以对这两种程序集使用不同的密钥。

在 Visual Studio 中创建签名的程序集和友元程序集

  1. 打开 Visual Studio 命令提示。

  2. 使用强名称工具,通过以下命令序列生成 keyfile 并显示其公钥。有关更多信息,请参见强名称工具 (Sn.exe)

    1. 生成此示例的强名称密钥,并将其存储在 FriendAssemblies.snk 文件中:

      sn -k FriendAssemblies.snk

    2. 从 FriendAssemblies.snk 文件中提取公钥,将其放入 FriendAssemblies.publickey 中:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. 显示存储在 FriendAssemblies.publickey 文件中的公钥:

      sn -tp FriendAssemblies.publickey

  3. 创建一个新 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
    
  4. 编译 FriendAssembliesSnA.vb 并对其签名:

    Vbc.exe /target:library /keyfile:FriendAssemblies.snk FriendAssembliesSnA.vb

  5. 创建一个新 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
    
  6. 编译 FriendAssembliesSnB.vb 并对其签名:

    Vbc.exe /keyfile:FriendAssemblies.snk /r:FriendAssembliesSnA.dll FriendAssembliesSnB.vb

    编译器生成的程序集的名称必须与传递给 InternalsVisibleToAttribute 属性的友元程序集的名称匹配。可以使用 /out 编译器选项显式设置该程序集。有关更多信息,请参见/out (Visual Basic)

  7. 运行 FriendAssembliesSnB.exe。

    该程序将显示一个消息框,其中包含字符串“Friend Assemblies Sample”。

安全性

InternalsVisibleToAttribute 属性和 StrongNameIdentityPermission 类之间存在相似性。主要的差异在于:StrongNameIdentityPermission 可以要求具有安全权限才能运行特定的一段代码,而 InternalsVisibleToAttribute 属性则控制 Friend 类型和成员的可见性。

请参见

任务

如何:创建未签名的友元程序集

概念

友元程序集 (Visual Basic)

参考

InternalsVisibleToAttribute

/keyfile

强名称工具 (Sn.exe)

其他资源

创建和使用具有强名称的程序集