读书笔记(二)对象激活和上下文
任何程序都需要在某个平台提供的环境中执行.对于传统的炒作系统而言,这种运行时环境的主要形式就是一个进程.一个进程不仅为你的代码提供了象虚拟内存,线程和内核对象这样的资源,还为你和别人的代码间提供了一个隔离边界.这种隔离不仅带来了某种程度上的保护,这样你的代码不会受到别人错误代码的影响还给你的程序提供一种独有的特性,比如可以单独的做安全配置,或者当前目录路径.
代码隔离在进程之间和进程内部都是游泳的.COM,COM+和公用语言运行时CLR都已经建立了这种模型以在进程内部内部提供细颗粒的代码隔离.在COM+和CLR中,这种细颗粒的隔离单元被称为上下文(context).
COM+上下文是COM单元的一部分,而COM单元本身是用于对线程对象分组的进程的一部分.CLR上下文是CLR应用程序的一部分,而CLR应用程序域本身是用于对共享相同安全和版本策略的对象分组的进程的一部分.上下文是COM+和.NET企业服务的编程模型的核心.每个被配置在COM+目录中的组件都会被自动的关联一个上下文.这种上下文使得系统拦截成为可能.
在COM+里配置的那些对象总是在一个上下文内运行.对象所需要的上下文由服务组件类上设定的上下文特性所定义.这些上下文特性定义了一个组件对于运行环境的需求.如果这里对象的调用这已经运行于一个上下文中.(因为它也是一个已配置的组件),则会检查这个上下文时候和这里对象所需要的相兼容.如果是,则这个对象将在调用者所在的上下文中运行.
如果这个上下文和这个对象所定西的不兼容,则将建立一个新的上下文.CLR和COM+都依赖于代理以保证对象间的上下文边界.代理(proxy)是处于不同的上下文中的真实对象的一个替身对象,代理负责在一二方法调用转换上下文.
既然上下文是根据一组用于声明对象所需要运行环境的属性来规定的,为一个对象定义一个上下文意味着这个对象支农从这个上下文内部直接访问.如果访问该对象的调用者所在上下文有所不同的化,则它不能直接调用该对象上的方法.而要通过一个代理.
(简单对象和上下文无关.普通的.NET对象都是简单对象,COM 对象总是绑定到一个上下文)
简单对象(Agile Object)
绑定了上下文的对象(Context Bound Object/CBO)
在.NET用于实现夸上下文通信的技术是.NET Remoting.所以CBO类和SynchroizationAttribute(继承自ContextAttribute类)被放在System.Runtime.Remoting.Context命名空间下.
.NET的安全边界:应用户程序域,一个进程可以包含多个应用程序域,来自一个域的对象不能和其他域的对象直接互相操作,互相操作用的是应用程序域信道.
using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;
[Synchronization]
class A:ContextBoundObject
{
public void Method1() {
string threadName = Thread.CurrentThread.Name;
Console.WriteLine(threadName + ": Method1 started");
Thread.Sleep(3000);
Console.WriteLine(threadName + ": Method1 finished");
}
}
class Test
{
A obj = new A();
public void ThreadMethod()
{
obj.Method1();
}
static void Main(string[] args)
{
Test test = new Test();
//create and start a thread
Thread t1 = new Thread(new ThreadStart(test.ThreadMethod));
t1.Name = "Thread 2";
t1.Start();
//invoke Method1 with the main thread
Thread.CurrentThread.Name = "Thread 1";
test.obj.Method1();
t1.Join();
}
}
所有服务组件的基类都是在System.EnterpriseService命名空间下的ServicedComponent类.这个类继承于System.ContextBoundObject类,所有服务组件都有一个.NET Remoting上下文.
当一个.NET服务组件被创建时,此时不仅建立了.NET上下文,还建立了一个连接到.NET上下文的COM+上下文.
- 线性表的顺序存储结构的实现及其应用(C/C++实现)
- IPython使用学习笔记
- 如何用Python调用java程序
- LCT学习笔记
- 队列的存储结构的实现(C/C++实现)
- 栈的存储结构的实现(C/C++实现)
- 【经验分享】Hydra(爆破神器)使用方法
- 基于pytest集成selenium
- Android应用程序使用两个LinearLayout编排5个Button控件
- Robot Framework | 02 从抛弃RIDE开始创建你的RFS测试
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 接口测试 | 25 requests + pytest测试实例
- 接口测试 | 22 requests基础入门
- 图的存储结构的实现(C/C++实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- parentheses - 22. Generate Parentheses
- palindrome - 132. Palindrome Partitioning II
- palindrome - 131. Palindrome Partitioning
- Parentheses - 20. Valid Parentheses
- Palindrome - 9. Palindrome Number
- Palindrome - 5. Longest Palindromic Substring
- Palindrome - 125. Valid Palindrome
- Sliding Window - 395. Longest Substring with At Least K Repeating Characters
- Sliding Window - 340. Longest Substring with At Most K Distinct Characters
- Sliding Window - 3. Longest Substring Without Repeating Characters
- Sliding Window - 30. Substring with Concatenation of All Words
- Sliding Window - 76. Minimum Window Substring
- GET和POST的区别
- String - 68. Text Justification
- String - 273. Integer to English Words