友元程序集(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控件作为数据传输的中介,只 ...
随机推荐
- 51Nod1140 矩阵相乘的结果
随机化算法. A*B==C那么X*A*B==X*C 降到了n*n复杂度. 多次随机X判断即可. By:大奕哥 #include<bits/stdc++.h> using namespace ...
- 冒泡排序 Exercise07_18
import java.util.Arrays; import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:冒泡排序 * */ pu ...
- bzoj 1009 DP 矩阵优化
原来的DP: dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀. 转移: i==0 dp[0][0] = 1 dp[0][1~m-1] = 0 i>=1 dp ...
- LCA POJ 1330 Nearest Common Ancestors
POJ 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24209 ...
- Map中keySet和entrySet的区别
在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet():将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代方式取出所有的键, ...
- mOByDiC E90C2600 EOBD/OBDII to RS232 gateway
http://www.ozenelektronik.com/downs/pdf/oe90c2600.pdf Features • Compatible with EOBD/OBDII standard ...
- Android开发:ListView加上长按事件
为ListView加上长按事件 lvMain.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public b ...
- document.readyState等属性,判断页面是否加载完
如何在页面加载完成后再去做某事?什么方法可以判断当前页面加载已完成?document.readyState 判断页面是否加载完成?javascript提供了document.readyState==& ...
- Wix使用整理(二)
1) 安装卸载时进行日志记录 Wix 制作的 Installer 的调试很麻烦,没有直接的 Bug 工具,可以通过记录安装日志的方式进行间接调试.命令为 msiexec /i pack ...
- unity 3D + Google Play In-app Billing (IAB)(转) 热度 3
最近由于工作需要,研究unity如何接入Google Play以实现游戏内购买.目前IAB的实现,prime31做的插件比较好,各平台的IAB均有,但费用相对过高(几乎都是70刀左右,可怜穷小子).在 ...
说明