博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
阅读量:5059 次
发布时间:2019-06-12

本文共 2447 字,大约阅读时间需要 8 分钟。

JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程),它旨在取代运行时库提供的 MarshalByrefObject 的功能。

本文主要介绍如何通过 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 中创建一个子 AppDomain13             var serviceDomain = AppDomain.CreateDomain("ServiceDomain", null, null);14             15             var myService = (MyService)serviceDomain.CreateInstanceAndUnwrap16                 (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任意域访问

如果您对示例源码感兴趣,请移步前往 下载(示例名称:ShuttleDomain任意域访问)。

 

转载于:https://www.cnblogs.com/johnny-liu/p/7200071.html

你可能感兴趣的文章
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
OpenCV矩阵运算总结
查看>>
Java Build Practice 4:Extend and Invoke Ant API
查看>>
[转] Transformer图解
查看>>
FreeBSD方式安装 MAC OSX
查看>>
Linux 根文件系统制作
查看>>
IOS--沙盒机制
查看>>