JointCode.Shuttle 是一個用於進程內 AppDomain 間通訊的服務架構(不支持跨進程),它旨在取代運行時庫提供的 MarshalByrefObject 的功能。html
1. 使用場景
git
在 .net / mono 開發中,通常不太須要建立新的 AppDomain,但在一些 特定狀況 下,也許咱們須要使用一個新的 AppDomain,並在其中執行一些操做。github
當代碼跨越 AppDomain 邊界訪問另外一個 AppDomain 時,便產生了跨 AppDomain 通訊。這時候,您能夠考慮使用 JointCode.Shuttle。架構
2. 傳統跨 AppDomain 通訊方式的問題框架
通常來講,在進行跨 AppDomain 調用時,大部分人使用運行時庫默認提供的、基於 MarshalByrefObject 類繼承的通訊機制。這種方式最簡單,只要讓須要跨 AppDomain 操做的類繼承 MarshalByrefObject 便可,實現起來很方便。例如:ide
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 }
簡單是簡單,但這種方式也有一些侷限性。有什麼侷限性呢?性能
除了 MarshalByrefObject 以外,可能還有 remoting、wcf 甚至於消息隊列等等跨進程的方式也能夠實現跨 AppDomain 通訊(做者本身沒嘗試過)。這些方式或多或少消除了上述那些限制,然而咱們也能想象獲得,原本是進程內通訊的事情,如今弄成進程間通訊,憑空增長許多開銷,那麼它們的性能必定比 MarshalByrefObject 更低,並且學習成本也會更高,實現起來也更復雜。學習
3. JointCode.Shuttle 的特色測試
與 MarshalByrefObject 相比,JointCode.Shuttle 除了具有相同的跨 AppDomain 通訊的功能以外,還有本身的一些特色:spa
4. 將來計劃
JointCode.Shuttle 是一個很是新穎的框架,功能還不是很完備。儘管做者將會在將來繼續完善現有功能,並推出更多新的功能,但目前仍是存在一些不足,主要包括:
5. 如何使用 JointCode.Shuttle
若是您對 JointCode.Shuttle 有興趣,請移步前往 這裏,咱們提供了一個簡單的示例來講明如何使用這個框架。