读书笔记(二)对象激活和上下文

任何程序都需要在某个平台提供的环境中执行.对于传统的炒作系统而言,这种运行时环境的主要形式就是一个进程.一个进程不仅为你的代码提供了象虚拟内存,线程和内核对象这样的资源,还为你和别人的代码间提供了一个隔离边界.这种隔离不仅带来了某种程度上的保护,这样你的代码不会受到别人错误代码的影响还给你的程序提供一种独有的特性,比如可以单独的做安全配置,或者当前目录路径.

代码隔离在进程之间和进程内部都是游泳的.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+上下文.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张首富-小白的成长历程

Linux-四剑客-find-awk-grep-sed解释----未完结版

find - search for files in a directory hierarchy 搜索目录层次结构中的文件 用来在指定目录下面查找文件或目录,任...

1313
来自专栏北京马哥教育

ansible之playbook功能简述

playbooks剧本简介 playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Ye...

3465
来自专栏云霄雨霁

Java虚拟机--内存模型

2135
来自专栏张戈的专栏

Linux:sed命令详解

1. 简介 sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。 ? sed 编辑器逐...

4456
来自专栏向治洪

深入理解Java之jvm启动流程

概述 当我们写一个Java类,并重写Main方法,程序就能运行起来。main方法的背后,程序为什么能运行,jvm究竟做了什么处理?要理解这些,就需要了解jvm的...

5715
来自专栏逸鹏说道

C# 温故而知新: 线程篇(二) 上

线程池和异步线程 目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程...

3189
来自专栏后端技术探索

vim 乱码问题解决及原理全面分析

Vim有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding(这些选项设置请...

1331
来自专栏智能算法

Python学习(六)---- 常用模块必备知识

https://blog.csdn.net/fgf00/article/details/52357477

1403
来自专栏L宝宝聊IT

Linux基础——正则表达式

1613
来自专栏好好学java的技术栈

java基础提升篇:深入浅出Java多线程

1242

扫码关注云+社区