使用 JointCode.Shuttle 访问任意 AppDomain 的服务

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程)。

本文主要介绍如何通过 JointCode.Shuttle 访问任意 AppDomain 的服务。

当我们要进行跨 AppDomain 调用时,一般我们会让需要跨 AppDomain 操作的类(服务类)继承自 MarshalByrefObject,接着在调用 AppDomain(父 AppDomain)中创建目标 AppDomain(子 AppDomain),然后直接通过子 AppDomain  的引用创建所需的服务对象,并调用服务对象的相关方法。代码就像这样:

 1 namespace JoitCode.Shuttle.SimpleSample
 2 {
 3     public class MyService : MarshalByRefObject
 4     {
 5         public void Do() { }
 6     }
 7
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             // 在默认 AppDomain 中创建一个子 AppDomain
13             var serviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null);
14
15             var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap
16                 (typeof(MyService).Assembly.FullName,
17                  "JoitCode.Shuttle.SimpleSample.MyService");
18
19             myService.Do();
20
21             Console.Read();
22         }
23     }
24 }

显然,通过这种方式,我们没有办法直接从子 AppDomain 中访问父 AppDomain。当然,我们也可以通过一些变通办法来实现双向通信,比如像下面这样:

    public class MarshalByRefCrossAccess1 : MarshalByRefObject
    {
        public void Run()
        {
            Console.Write("Now, we are running in AppDomain [{0}]!", AppDomain.CurrentDomain.FriendlyName);
            Console.WriteLine();
        }
    }

    public class MarshalByRefCrossAccess2 : MarshalByRefObject
    {
        public void Run(MarshalByRefCrossAccess1 arg)
        {
            Console.WriteLine("Currently, we are running in AppDomain [{0}]: ", AppDomain.CurrentDomain.FriendlyName);
            arg.Run();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var remoteDomain = AppDomain.CreateDomain(Guid.NewGuid().ToString(), null, null);
            var access2 = (MarshalByRefCrossAccess2)remoteDomain.CreateInstanceAndUnwrap
                (typeof(MarshalByRefCrossAccess2).Assembly.FullName, typeof(MarshalByRefCrossAccess2).FullName);
            var access1 = new MarshalByRefCrossAccess1();
            access2.Run(access1);

            Console.Read();
        }
    }

尽管可以变通实现双向通信,但诸如此类的办法总是显得不那么自然。更为重要的是,这是双向通信,通信双方互相持有对方,因此我们可以这样达到目的。

但如果我们想要与之通信的对象根本不在我们掌控之中(即不持有其引用)呢?

比如说,我们在一个  AppDomain A 中创建了另外两个 AppDomain B 和 C,现在如果 AppDomain B 要访问 AppDomain C,又当如何呢?

JointCode.Shuttle 天生就能够解决这种问题。

我们为此写了一个示例。以下是该示例输出的部分截图:

如果您对示例源码感兴趣,请单击 此处 下载(示例名称:ShuttleDomain任意域访问)。

时间: 2024-08-05 01:26:23

使用 JointCode.Shuttle 访问任意 AppDomain 的服务的相关文章

使用 JointCode.Shuttle 进行跨 AppDomain 通信的一个简单示例

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程). 本文通过一个简单的示例来演示如何使用 JointCode.Shuttle. JointCode.Shuttle 的发行包 在 JointCode.Shuttle 的发行包中,包含两个文件:JointCode.Shuttle.dll 和 JointCode.Shuttle.Library.dll,其中 JointCode.Shuttle.dll 是使用托管语言编写的库文件,JointCod

JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架

JointCode.Shuttle 是一个用于 AppDomain 间通信的服务架构. 1. 什么情况下使用 JointCode.Shuttle 在 .net / mono 开发中,一般不太需要使用额外的 AppDomain,但在一些 特定情况下,让代码运行在新的 AppDomain 中也许是一个好的选择. 当代码需要跨越 AppDomain 边界访问另一个 AppDomain 时,便产生了跨 AppDomain 通信的问题,JointCode.Shuttle 正是专为此目的而开发的一个服务框架

使用 JointCode.Shuttle 动态注册 / 注销服务

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程). 本文将介绍如何使用 JointCode.Shuttle 在运行时动态注册 / 注销服务. 假设我们有一个服务契约 A,使用 JointCode.Shuttle,我们可以在运行时: 在一个 AppDomain(B)中注册一个服务实现(它实现了服务契约 A), 在另一个 AppDomain( C)中消费此服务(通过服务契约 A). 然后,我们可以在 AppDomain(B)中注销上述服务实现

使用 JointCode.Shuttle 管理远程服务对象的生命期

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程). 一般情况下,在进行跨 AppDomain 调用时,大部分人选择使用运行时库默认提供的.基于 MarshalByrefObject 类继承的通信机制.代码也很简单,例如: 1 namespace JoitCode.Shuttle.SimpleSample 2 { 3 public class MyService : MarshalByRefObject 4 { 5 public void

windows系统访问linux系统samba服务案例

Windows访问linux系统samba服务 案例:某公司(xxxcompany)有研发部,运维部,网络部,人力资源部,财务部,综合部,采购部,市场部.这8个部门需要分享资源 要求: 研发部有自己的目录:devlopment.研发部的目录研发部所有员工和运维manager可以访问下载,但是只有研发manager可以下载,修改和上传 运维部有自己的目录:operation.运维部的目录运维部所有员工和研发manager可以访问下载,但是只有运维manager可以下载,修改和上传 网络部有自己的目

通过rinetd实现端口转发来访问内网的服务

一.   问题描述 通过外网来访问内网的服务 二.   环境要求 需要有一台能够外网访问的机器做端口映射,通过数据包转发来实现外部访问阿里云的内网服务 三.   操作方法 做端口映射的方案有很多,Linux下的ssh tunnel和windows下的portmap等等,这里分享一个更稳定和简单的小工具rinetd 四.   下载安装 $ wget http://www.boutell.com/rinetd/http/rinetd.tar.gz $ tar -xvf rinetd.tar.gz $

WCF运行错误:添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。

使用WCF写了一个小程序测试一下它的功能在运行时报错.“添加服务失败.服务元数据可能无法访问.请确保服务正在运行并且正在公开元数据.” 如下图所示: 查了下资料把它解决了,记录一下. 解决方法: 将web.config中的 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/> 修改为 <serviceHost

爬虫--用cookie访问任意网页

#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################# # File : requestAnyURLWithCookie.py # Author : lucasysfeng # Revision : 2014-06-13 11:08:00 # Description : 用cookie访问任何网页(已经有cookie了,不需要登录等验证) # : cookie用浏览器查

windows下使用远程工具登录虚拟机上的Linux、访问虚拟机上的服务 、端口转发、win7 telnet登陆虚拟机

首先要清楚virtual box如何设置端口转发: 一篇文章: 如何使用VirtualBox进行端口转发 由于默认的方式是用NAT来做虚拟机网络的,因此如果从外网想访问虚拟机的应用会比较麻烦.以前一直用桥接的方式,但IP有限,自己指定的IP可能会和局域网的IP冲突,而用DHCP方式获取的IP又可能会发生变化导致不确定,怎么办?网上查了一下,简单有效的解决方法就是用VirtualBox的“端口映射”功能.下面结合实例来讲讲怎么操做: 应用场景:要将虚拟机的Web 80端口从外面能访问到. 1. 首