友元程序集(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控件作为数据传输的中介,只 ...
随机推荐
- /etc/default/useradd配置文件详解
/etc/default/useradd文件内容如下: [xf@xuexi ~]$ cat /etc/default/useradd # useradd defaults file GROUP=100 ...
- hdu 1690 Bus System (有点恶心)
Problem Description Because of the huge population of China, public transportation is very important ...
- Week Five
2018.12.25 1.[BZOJ 4310] 2.[BZOJ 3879] 3.[BZOJ 2754] 4.[BZOJ 4698] 5.[Codeforces 914E] 6.[Codeforces ...
- 入侵91网直到拿下服务器#并泄露150w+用户信息
在补天看到一厂商 首先挖到一处注入 http://www.91taoke.com/index.php?m=Dayi&a=answer&aid=26313 此处注入是dba权限 打算使用 ...
- Android演示Stack(课下作业)
Demand 之前活动中误传成别的截图,故在此补充博客 1.使用自己实现的栈构建Android程序,提供用于栈的一个puh按钮和pop按钮,在文本域接收一个字符串作为push的输入,文本区将显示每个操 ...
- l1和l2正则化的区别 - 面试错题集
L0:计算非零个数,用于产生稀疏性,但是在实际研究中很少用,因为L0范数很难优化求解,是一个NP-hard问题,因此更多情况下我们是使用L1范数L1:计算绝对值之和,用以产生稀疏性,因为它是L0范式的 ...
- April Fools Day Contest 2016 A. Da Vinci Powers
A. Da Vinci Powers 题目连接: http://www.codeforces.com/contest/656/problem/A Description The input conta ...
- Codeforces Round #301 (Div. 2) D. Bad Luck Island 概率DP
D. Bad Luck Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/pr ...
- C#中&和&&,|和||区别
当两者都为逻辑运算符时. 其实没什么差别. &&和||当已经确定结果时,不会对第二个操作数求值.也不知道什么情况会用到这个差别.做个笔记好了. http://blog.csdn.net ...
- pom通用依赖
<dependencies><!--common--><dependency><groupId>com.google.guava</groupId ...