读经典——《CLR via C#》(Jeffrey Richter著) 笔记_友元程序集

【应用场景】

程序集A访问程序集B定义的Internal访问类型的类的成员。

【使用方式】

在构建程序集B的时候,引入System.Runtime.CompilerServices,以此来添加InternalsVisibleTo attribute

【例子】

程序集B——

using System;
using System.Runtime.CompilerServices;//为了InternalsVisibleTo 属性

//当前程序集中internal类型可由以下程序集中
//的任何代码访问(不管什么版本或语言文化)
[assembly:InternalsVisibleTo("程序集A的名字,PublicKey=1234...")]
internal sealed class SomeInternalType{...}

程序集A——

using System;
internal sealed class Foo
{
  private static Object SomeMethod()
 {
    //这个程序集A能访问另一个程序集中的internal类型,
    //就好像那是一个public类型一样
    SomeInternalType sit = new SomeInternalType();
    return sit;
  }
}

【注意】

在添加InternalsVisibleTo attribute的时候不要指定版本号,语言文化和处理器架构

时间: 2024-10-10 22:35:07

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_友元程序集的相关文章

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); } } 程序运行时,CLR会加载并初始化它.CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken.然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT(just-in-time)编译成本地(native)代码.编译时

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)

一个应用程序的XML配置文件示例: <?xml version="1.0"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="AuxFiles;bin\subdir" /> <dependentAssembly>

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_通过ILDasm.exe查看编译器如何将类型及其成员编译成元数据

[实例代码] using System; public sealed class SomeType //-------------1 { //嵌套类 private class SomeNestedType{} //-------------2 //常量.只读字段和静态可读/可写字段 private const Int32 SomeConstant = 1; //-------------3 private readonly Int32 SomeReadOnlyField = 2; //----

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型

[概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符号8号位值 short System.Int16 有符号16位值 ushort System.UInt16 无符号16位值 int System.Int32 有符号32位值 uint System.UInt32 无符号32位值 long System.Int64 有符号64位值 ulong Syst

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)

[基元类型推荐] 推荐直接使用 FCL 类型. [理由] 编码时不至于困惑string与String的使用.由于C#的stirng(一个关键字)直接映射到System.String(一个 FCL 类型),所以两者没有区别,都可以使用.不至于困惑int在32位操系统和64位操作系统上代表的整数不同. 有的开发人员认为int在32位操作系统上运行时,代表32位整数:而在64位操作系统上运行时,代表64位整数,这个观点完全错误.在C# 中,int 始终映射到System.Int32,所以不管在什么操作

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_命名空间和程序集的关系

命名空间和程序集不一定相关 1. 同一个命名空间中的各个类型可能是在不同的程序集中实现的.(System.IO.FileStream在MSCorLib.dll程序集中,而System.IO.FileSystemWatcher在System.dll程序集中) 2. 同一个程序集中,也可能包含不同命名空间中的类.(System.Int32和System.Text.StringBuilder类型都在MSCorLib.dll程序集中)

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型转换(一)

1. C# 不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换: 2. 然而,将对象转换为它的某个派生类型时,C#要求开发人员只能进行显示转换,因为这样的转换可能在运行时失败: 例子: internal class Employee{ ... } public sealed class Program { public static void Main() { //不需要转型,因为new返回一个Employee对象, //而Object是Emplo

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(三)

[checked 和 unchecked 基元类型操作] 1.第一种使用方式 UInt32 invalid = unchecked((UInt32) (-1)); //OK,不会抛异常 Byte b = 100; b = checked((Byte) (b + 200));//抛出OverflowException异常 2.第二种使用方式 checked {//开始一个checked块 Byte b = 100; b = (Byte) (b + 200);//该表达式会进行溢出检查 }//结束一

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型的各种成员

[Class中,可能包含的成员] 常量, 字段, 实例构造器, 类型构造器, 方法, 操作符重载, 转换操作符, 属性, 事件, 类型(Class)