友元程序集(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控件作为数据传输的中介,只 ...
随机推荐
- innerText和innerHTML, outerHTML
js中 innerHTML与innerText的用法与区别及解决Firefox不支持Js的InnerHtml问题 用法: <div id="test"> <spa ...
- 外行人都能看懂的SpringCloud
一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...
- 注入AspectJ切面
为什么要用AspectJ:AspectJ提供了Spring AOP很多不能实现的多种切点类型(比如属性,构造方法切入,由于不能实现构造方法的切入spring aop就不能实现对象创建过程的通知) As ...
- Xamarin 2017.9.19更新
Xamarin 2017.9.19更新 本次更新是添加Xamarin.iOS对iOS 11和Xcode 9的支持.Visual Studio 2017升级到15.3.5获得更新功能.Visual ...
- BZOJ1087【状压DP】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1087] 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击 ...
- Linux Shall命令入门
Linux Shall命令入门 ifconfig //查看ip信息 service network start ...
- BZOJ [JSOI2008]星球大战starwar
正着显然不可做,我们采取反向并查集,将删点改为加点,每次贪心的认为加了一个联通块,一旦不符就减一. #include<bits/stdc++.h> using namespace std; ...
- HDU 5909 Tree Cutting(FWT+树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5909 [题目大意] 给出一棵树,其每棵连通子树的价值为其点权的xor和, 问有多少连通子树的价值为 ...
- [UOJ61]怎样更有力气
这个题还是挺有意思的... 一个小结论是:在一个$n$点$m$边的图中,如果度数最小的点度数为$d$,那么$d^2=O(m)$,因为$d\leq\frac{2m}n$,所以$d^2\leq dn\le ...
- 【四边形不等式】HDU3506-Monkey Party
[题目大意] 香蕉森林里一群猴子(n<=1000)围成一圈开会,会长给他们互相介绍,每个猴子需要时间a[i].每次只能介绍相邻的两只猴子x和y认识,同时x所有认识的猴子和y所有认识的猴子也就相互 ...
说明