JointCode.Shuttle 是一个用于进程内 AppDomain 间通信的服务架构(不支持跨进程),它旨在取代运行时库提供的 MarshalByrefObject 的功能。
1. 使用场景
在 .net / mono 开发中,一般不太需要创建新的 AppDomain,但在一些 特定情况 下,也许我们需要使用一个新的 AppDomain,并在其中执行一些操作。
当代码跨越 AppDomain 边界访问另一个 AppDomain 时,便产生了跨 AppDomain 通信。这时候,您可以考虑使用 JointCode.Shuttle。
2. 传统跨 AppDomain 通信方式的问题
一般来说,在进行跨 AppDomain 调用时,大部分人使用运行时库默认提供的、基于 MarshalByrefObject 类继承的通信机制。这种方式最简单,只要让需要跨 AppDomain 操作的类继承 MarshalByrefObject 即可,实现起来很方便。例如:
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 }