友元程序集(C# 和 Visual Basic)

Visual Studio 2013

“友元程序集”是一种能够访问其他程序集的 Friend (Visual Basic) 或 internal (C#) 类型和成员的程序集。 如果将程序集指定为友元程序集,则不再需要将类型和成员标记为公共,以使其他程序集可以访问它们。 在以下情况下,使用友元程序集尤其方便:

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

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

备注

使用 InternalsVisibleToAttribute 特性可以为给定程序集指定一个或多个友元程序集。 下面的示例使用程序集 A 中的 InternalsVisibleToAttribute 特性,并将程序集 AssemblyB 指定为友元程序集。 这样,程序集 AssemblyB 将能够访问程序集 A 中标记为 Friend (Visual Basic) 或 internal (C#) 的所有类型和成员。

 说明

在对将要访问另一个程序集(程序集 A)的内部类型或内部成员的程序集(程序集 AssemblyB)进行编译时,必须用 /out 编译器选项显式指定输出文件的名称(.exe 或 .dll)。 这是必需的,因为当编译器将生成的程序集绑定到外部引用时,尚未为该程序集生成名称。 有关更多信息,请参见 /out (C#) 和 /out (Visual Basic)。

C#
using System.Runtime.CompilerServices;
using System;[assembly: InternalsVisibleTo("AssemblyB")]// The class is internal by default.
class FriendClass
{public void Test(){Console.WriteLine("Sample Class");}
}// Public class that has an internal method.
public class ClassWithFriendMethod
{internal void Test(){Console.WriteLine("Sample Method");}}

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

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

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

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

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

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

StrongNameIdentityPermission 类还提供共享类型的功能,其与友元程序集的区别如下:

  • StrongNameIdentityPermission 应用于单个类型,而友元程序集应用于整个程序集。

  • 如果程序集 A 中有您希望与程序集 B 共享的数百个类型,则必须将 StrongNameIdentityPermission 添加到所有这些类型。 如果使用友元程序集,则只需声明友元关系一次。

  • 如果使用 StrongNameIdentityPermission,则必须将希望共享的类型声明为公共类型。 如果使用友元程序集,则将共享的类型声明为 Friend (Visual Basic) 或 internal (C#)。

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

请参见

任务

如何:创建未签名友元程序集(C# 和 Visual Basic)
如何:创建签名的友元程序集(C# 和 Visual Basic)

参考

InternalsVisibleToAttribute
StrongNameIdentityPermission

概念

程序集和全局程序集缓存(C# 和 Visual Basic)
C# 编程指南

其他资源

Visual Basic 编程指南

友元程序集(C# 和 Visual Basic)相关推荐

  1. 特性(C# 和 Visual Basic)

    特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联. 特性与程序实体关联后,即可在运行时使用名为"反射"的技术查询特性. 有关更多信息,请参见 ...

  2. 防止对 Visual Basic .NET 或 C# 代码进行反相工程

    发布日期: 12/28/2004 | 更新日期: 12/28/2004 Gabriel Torok和 Bill Leach 本文假设您熟悉 .NET 与 C# 摘要 .NET 体系结构的优势之一在于, ...

  3. visual basic.net 2019-判断null,is null

    Nothing 关键字(Visual Basic) 表示任意数据类型的默认值. 对于引用类型,默认值为 null 引用. 对于值类型,默认值取决于值类型是否可以为 null. 对于不可为 null 的 ...

  4. [引]VS2005 之 Visual Basic 程序的结构

    1.文件级编程元素 2.命名空间级编程元素 3.模块级编程元素 4.过程级编程元素 5.Main 过程 Visual Basic 程序是依据标准的构造块建立起来的. 一个解决方案由一个或多个项目组成. ...

  5. UBound 函数 (Visual Basic)

    http://msdn.microsoft.com/zh-cn/vbrun/95b8f22f.aspx Visual Basic 语言参考 UBound 函数 (Visual Basic) 更新:20 ...

  6. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(一)

    vb.net教程https://www.xin3721.com/eschool/vbnetxin3721/ 为了保护自己辛辛苦苦编写的Excel VBA代码不被盗用,我们需要对Excel VBA代码进 ...

  7. 《Visual Basic.Net 循序渐进》详细目录

    ​ 链接:https://pan.baidu.com/s/1IfaLvlklx-nT4KK4VKZuIw  提取码:ip5n 更新日期:2022年7月19日 更新章节:45个 更新代码:31个 目前教 ...

  8. 用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(一)

    为了保护自己辛辛苦苦编写的Excel VBA代码不被盗用,我们需要对Excel VBA代码进行加密.通常的做法是利用给工程设置密码的方法实现加密,对于这类加密方法,由于存在安全度低.易破解等问题,因此 ...

  9. linux下开发basic程序设计,使用 Visual Basic 编写基于 Unity3D 的计算器

    随着 .NET 全平台战略的推进,微软正在让以 C# 为先锋的 .NET 拥有跨平台特性.这个过程中一直有人想知道其它 .NET 语言对跨平台的支持有什么改进,熟悉 C# 但是喜欢用 VB 的我也不例 ...

最新文章

  1. R语言使用fs包的file_info函数查看文件元信息(属性信息)、使用file_chmod函数修改文件的权限、使用file_chown函数修改文件的所有者
  2. Python的日志记录-logging模块的使用
  3. 超强!MDETR:基于Transformer的端到端目标检测神器!开源!
  4. 快速删除从CSDN复制的代码行前的数字的方法
  5. msvcp110d.dll 丢失问题原因及解决思路
  6. java数据结构是什么_java数据结构
  7. 24.事务控制和锁定语句
  8. 机器人工程师学习计划(计算机相关专业学习计划)
  9. 计算机论文物业管理系统,小区物业管理系统的设计与实现(计算机毕业设计)...
  10. PDF文件修改最常用的方式有哪些?
  11. 过期系统激活 win7
  12. built a JNCIS LAB系列:Chapter 4 BGP
  13. java中的守护线的应用_JVM中的守护线程示例详解
  14. [原创]数字转换中文大写金额
  15. k8s中配置namespace的最小和最大内存
  16. oss视频转码处理(解决部分浏览器无法正常播放问题)
  17. 连咖啡:新零售时代中的娱乐“生意经” | 一点财经
  18. Java学习笔记(二十三)日志体系(logback)
  19. 关于谷歌浏览器被搜狗网址导航恶意劫持解决办法
  20. job处理缓慢的性能问题排查与分析(r4笔记第18天)

热门文章

  1. 将对象序列化与反序列实例
  2. CXF2.7.3 与spring 3集成 .
  3. 【错误记录】编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )
  4. 【ijkplayer】编译 Android 版本的 ijkplayer ① ( Ubuntu 安装 Git 软件 | 下载 ijkplayer 代码 )
  5. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数共轭对称性质 | 实信号自相关函数偶对称 | 复信号自相关函数共轭对称 | 复信号互相关函数共轭对称 )
  6. 【错误记录】Flutter 使用 MediaQuery 适配全面屏报错 ( No MediaQuery widget ancestor found. )
  7. 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
  8. 【RecyclerView】 七、RecyclerView.ItemDecoration 条目装饰 ( getItemOffsets 边距设置 )
  9. 【计算理论】计算复杂性 ( 两个带子的图灵机的时间复杂度 )
  10. 【JetPack】kotlin-android-extensions 插件 ( 视图绑定简单用法 )