友元程序集(C# 和 Visual Basic)
友元程序集(C# 和 Visual Basic)
“友元程序集”是一种能够访问其他程序集的 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)。 |
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)
如何:创建签名的友元程序集(C# 和 Visual Basic) Visual Studio 2013 本示例演示了如何将友元程序集和具有强名称的程序集一起使用. 这两种程序集必须都使用强名称. ...
- 演练:Office 编程(C# 和 Visual Basic)
https://msdn.microsoft.com/zh-cn/library/ee342218(v=vs.110).aspx PIA的全称是 primary interop assembly 主 ...
- [引]MSDN Visual Basic 和 C# 中都会用到的编程概念
本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容 ...
- 如何:使用 Visual Basic 编写基于 Unity3D 的计算器
随着 .NET 全平台战略的推进,微软正在让以 C# 为先锋的 .NET 拥有跨平台特性.这个过程中一直有人想知道其它 .NET 语言对跨平台的支持有什么改进,熟悉 C# 但是喜欢用 VB 的我也不例 ...
- Visual Basic 2017 操作Excel和word【1】持续更新……
我坚持在VB的路上走到黑………… 清单1.1 从应用程序对象导航到Excel中的工作表 Dim myWorkbooks As Excel.Workbooks = app.Workbooks ) ...
- 特性(C# 和 Visual Basic)
特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联. 特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性. 有关更多信息,请参见 反射(C# 和 V ...
- 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]
看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...
- Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010
摘 要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...
- Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
(注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘 要:DataGridView控件作为数据传输的中介,只 ...
随机推荐
- Java常用工具类之发送邮件
package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- bWAPP练习--injection篇之HTML Injection - Reflected (POST)
POST的和之前的GET的过程差不多,只是表单的提交方式不一样而已. low 我们在表单中填入一个超链接 <a href="http://www.cnblogs.com/ESHLkan ...
- Xcode_7_GM_seed.dmg下载
Xcode_7_GM_seed.dmg下载 Xcode_7_GM_seed.dmg 免费下载链接: http://pan.baidu.com/s/1pJ7oGAZ 密码: y5bx
- hdu 1372Knight Moves
E - Knight Moves Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- 表白 代码 韩梦飞沙-画心.html
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 韩梦飞沙-画心.html <!DOCTYPE html> <html& ...
- bzoj1116 [POI2008]CLO 边双联通分量
只需对每个联通块的$dfs$树检查有没有返租边即可 复杂度$O(n + m)$ #include <cstdio> #include <cstring> using names ...
- JDK源码(1.7) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- hdu 5206 Four Inages Strategy 判断是否是正方形
Four Inages Strategy Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem. ...
- CentOS 6.9/7通过yum安装指定版本的Node.js
说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql xxx可以知道全部文件的地方等等. Node.js(8.x) 一.安装和配置 1.安装Node.js ...
- HDU 4496 D-City (并查集,水题)
D-City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...