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

友元程序集(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 编程指南

时间: 2024-10-08 14:05:34

友元程序集(C# 和 Visual Basic)的相关文章

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

如何:创建签名的友元程序集(C# 和 Visual Basic) Visual Studio 2013 本示例演示了如何将友元程序集和具有强名称的程序集一起使用. 这两种程序集必须都使用强名称. 尽管本示例中的两种程序集使用了相同的密钥,但您可以对这两种程序集使用不同的密钥. 在 Visual Studio 中创建签名的程序集和友元程序集 打开 Visual Studio 命令提示. 使用强名称工具,通过以下命令序列生成 keyfile 并显示其公钥. 有关更多信息,请参见Sn.exe(强名称工

特性(C# 和 Visual Basic)

特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联. reflection.' data-guid="716c0768f610f38427afe934e71f1d47">特性与程序实体关联后,即可在运行时使用名为"反射"的技术查询特性. Reflection (C# and Visual Basic).' data-guid="4484aa4f01eb3fabaeabfd2ce4c39248">有

Visual Basic 2017 操作Excel和word【1】

 清单1.1  从应用程序对象导航到Excel中的工作表  Dim myWorkbooks As Excel.Workbooks = app.Workbooks Dim myWorkbook As Excel.Workbook = myWorkbooks.Item(1) Dim myWorksheets As Excel.Sheets = myWorkbook.Worksheets Dim myWorksheet As Excel.Worksheet myWorksheet = CType(my

Visual Basic 2010&.NET 4高级编程(第6版)pdf

下载地址:网盘下载 <Visual Basic 2010&.NET 4高级编程(第6版)>讨论了最常见的编程任务和概念,通过大量示例阐述了Visual Basic 2010的各种新特性,包括许多.NET功能,如LINQ to SQL.LINQ to XML.XML.WCF等. 目录: 第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 1.1 Visual Studio 2010:Express到Ultimate的各种版本 1.2 Visual Basic的关键字和

Visual Basic快捷教程——流程控制

美籍匈牙利数学家冯·诺依曼于1946年提出"程序存储,顺序执行"的观念,为现代计算机奠定了重要基础.这一观点认为:应该把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存.电子计算机的数制宜采用二进制:计算机应该按照程序顺序执行.所以现在开发人员在编写的程序代码时,其实都隐含地认为计算机将来会一行一行按顺序来执行这些指令.但是在顺序执行的过程中,有时我们希望计算机根据条件判断来选择性地执行(或者不执行)一些代码--这时就需要用到选择结构(或称分支结构).另外一些时候,我们希

Visual Basic for Applications

Visual Basic for Application(VBA) is an implementation of Microsoft’s event-driven programming language Visual Basic 6. Its associated integrated development(IDE) are built into most Microsoft Office applications. It enables building user defined fun

【Visual Basic】vb6的ListView控件,对Access2003数据库的增删改查,判断是否有中文、多窗体操作

vb6对Access2003数据库的增删改查并不复杂,可以通过ado对象轻松完成,下面举个小例子,同时说明vb6中的ListView控件的使用.虽然在<[Visual Basic]列表控件ListView的增删改查.模态对话框.禁止窗口调整大小>曾经对VB.NET的ListView控件进行详细的说明,但是证明微软就是个坑爹货,vb6对于ListView实现的代码居然跟VB.NET有着彻底的不同,似乎换了一门语言似得的.改代码什么的最讨厌的. 首先,在vb6生成的工程文件夹中有着一个db1.md

VB.NET &amp; Visual Basic

当看到VB.NET者这本书籍的时候,翻开目录唯一的感受就是:这不和VB一样吗?到底有什么区别呢? 1)版本: 重新回顾VB,可以发现其实他是Microsoft退出的基于Windows操作系统环境下的软件开发工具,是一种功能强大的高级程序设计语言. Visual指的是GUI(graphical userinterfaces)的方法.使用这种方法进行程序设计时,用户只需根据界面设计的要求,将预先建立的对象添加到屏幕上,设置他们的各种属性. Basic指的是Basic语言,VB是BASIC语言的进一步

我与Visual Basic的那些事儿

公元2000年,IEEE计算机协会的一份期刊<Computing in Science & Engineering>上,两位客座编辑Francis Sullivan和Jack Dongarra遴选出了20世纪科学与工程的实践与发展上最具影响力的十大算法[1].随后,Barry Cipra又在SIAM News上发表文章对这十大算法进行了综述[2].2016年,SIAM的主席Nick Higham对原来的十大算法列表进行了些许调整,并给出了自己的名单[3].两份名单在十大算法中的七项上基