友元程序集 (Visual Basic)

更新:2007 年 11 月

“友元程序集”是一种允许访问其他程序集的 Friend 类型和成员的程序集。(有关更多信息,请参见Friend (Visual Basic)。) 如果将程序集指定为友元程序集,则不再需要将类型和成员标记为公共,以使其他程序集可以访问它们。在以下情况下,使用友元程序集尤其方便:

  • 在单元测试中,测试代码在另一个程序集中运行,但需要访问正在测试的标记为 Friend 的程序集中的成员。

  • 您正在开发类库,库的附加部分包含在单独的程序集中,但需要访问标记为 Friend 的现有程序集中的成员。

备注

使用 InternalsVisibleToAttribute 属性可以为给定程序集指定一个或多个友元程序集。例如,如果将 InternalsVisibleToAttribute 属性包括在程序集 A 中,并指定程序集 B 作为友元程序集,则程序集 B 将可以访问程序集 A 中标记为 Friend 的所有类型和成员,如下例所示。

Imports System.Runtime.CompilerServices

<Assembly: InternalsVisibleTo("FriendAssembliesB")> 

' Friend class.
Friend Class FriendAssembliesA
    Public Sub Test()
        MsgBox("Friend Assemblies Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class FriendAssembliesClassA
    Friend Sub Test()
        MsgBox("Friend Assemblies Sample Method")
    End Sub
End Class

只有显式指定为友元的程序集才可以访问 Friend 类型和成员。例如,如果程序集 B 是程序集 A 的友元,且程序集 C 引用了程序集 B,则 C 不能访问 A 中的 Friend 类型。

编译器对传递给 InternalsVisibleToAttribute 属性的友元程序集名称执行一些基本验证。如果程序集 A 将 B 声明为友元程序集,则验证规则如下:

  • 如果程序集 A 具有强名称,则程序集 B 也必须具有强名称。传递给属性的友元程序集名称必须包括程序集名称,以及用于签发程序集 B 的强名称密钥的公钥。

    传递给 InternalsVisibleToAttribute 属性的友元程序集名称不能是程序集 B 的强名称:不包含程序集版本、区域性、结构或公钥标记。

  • 如果程序集 A 不具有强名称,则友元程序集名称应仅包含该程序集名称。有关更多信息,请参见如何:创建未签名的友元程序集

  • 如果程序集 B 具有强名称,则必须使用项目设置或命令行 /keyfile 编译器选项,为程序集 B 指定强名称密钥。有关更多信息,请参见如何:创建签名的友元程序集

有关如何从模块文件(具有 .netmodule 扩展名的文件)访问程序集的 Friend 类型和方法的信息,请参见 /moduleassemblyname

安全说明:

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

请参见

任务

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

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

概念

程序集

参考

InternalsVisibleToAttribute

程序集链接器 (Al.exe)

/addmodule

其他资源

Visual Basic 编译器