C#のクロスアプリケーションドメイン通信

パブリック クラスMyTaskに
    { 
        パブリック クラスMyEventArgs:EventArgsの
        { 
            パブリック オブジェクト EventDataの{ 取得しますプライベート セット; } 

            公共 MyEventArgs(オブジェクトEVENTDATAを)
            { 
                この .EventData = EVENTDATA。
            } 
        } 

        公共の イベントのEventHandler <MyEventArgs> MyEvent。

        公共 ボイドDoWork()
        { 
            Console.WriteLineを(" スタート" );
            するvar i = 0 ;
            一方、(I ++は< 10 
            { 
                のThread.sleep(1000年)。
                VaRの TEMP = この.MyEvent。
                もし(!TEMP = nullの
                    温度(この新しい MyEventArgs(" MyEvent(" + i.ToString()+ " " )); 
            } 
            Console.WriteLineを(" 終了" )。
        } 
    }

    公共の 静的な クラスNewAppDomain 
    { 
        ///  <要約> 
        /// 无参调用
         ///  </要約> 
        ///  <PARAM NAME = "アクション"> </ param>の
        公共の 静的な 無効実行(アクションアクション)
        { 
            AppDomainのドメイン = NULL ; 

            試す
            { 
                ドメイン = AppDomain.CreateDomain(" 新しいアプリケーションドメイン:" + Guid.NewGuid()); 

                VAR domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                     typeof演算(AppDomainDelegate).Assembly.FullName、
                     typeof演算(AppDomainDelegate).FullName)。

                domainDelegate.Execute(アクション)。
            } 
            最後に
            { 
                場合(ドメイン!= NULL 
                    AppDomain.Unload(ドメイン)。
            } 
        } 

        ///  <要約> 
        /// 有参调用
         ///  </要約> 
        ///  <typeparam名= "T"> </ typeparam> 
        ///  <PARAM NAME = "パラメータ"> </ PARAM > 
        ///  <PARAM NAME = "アクション"> </ param>の
          アクション)
        { 
            アプリケーションドメインのドメイン = NULL ; 

            試す
            { 
                ドメイン = AppDomain.CreateDomain(" 新しいアプリケーションドメイン:" + Guid.NewGuid()); 

                VAR domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                     typeof演算(AppDomainDelegate).Assembly.FullName、
                     typeof演算(AppDomainDelegate).FullName)。

                domainDelegate.Execute(パラメータ、アクション)。
            } 
            最後に
            { 
                場合(ドメイン!= nullを
                    AppDomain.Unload(ドメイン); 
            } 
        } 

        ///  <要約> 
        /// 有返回值的无参调用
         ///  </要約> 
        ///  <typeparam名= "T"> </ typeparam> 
        ///  <PARAM NAME = "アクション" > </ PARAM> 
        ///  <戻る> </戻り> 
        パブリック 静的 Tは<T>(機能<T>実行アクション)
        { 
            アプリケーションドメインのドメイン = NULL ; 

            試す
            { 
                ドメインは = AppDomain.CreateDomain(" 新しいアプリケーションドメイン:" + GUIDです。

                NewGuid())。ましたdomainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                     typeof演算(AppDomainDelegate).Assembly.FullName、
                     typeof演算(AppDomainDelegate).FullName)。

                返すdomainDelegate.Execute(アクション)。
            } 
            最後に
            { 
                場合(ドメイン!= NULL 
                    AppDomain.Unload(ドメイン)。
            } 
        } 

        ///  <要約> 
        /// 有返回值的有参调用
         ///  </要約> 
        ///  <typeparam名= "T"> </ typeparam> 
        ///  <typeparam名= "TResult" > </ typeparam>
         <PARAM NAME = "パラメータ"> </ PARAM> 
        ///  <PARAM NAME = "アクション"> </ PARAM> 
        ///  <戻る> </戻り> 
        パブリック 静的が実行TResult <T、TResult>(TパラメータFUNC <T、TResult> アクション)
        { 
            アプリケーションドメインのドメイン = NULL ; 

            試す
            { 
                ドメイン = AppDomain.CreateDomain(" 新しいアプリケーションドメイン:" + Guid.NewGuid()); 

                VAR domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                     typeof演算(AppDomainDelegate).Assembly.FullName、
                    (AppDomainDelegate).FullName)。

                返すdomainDelegate.Execute(パラメータ、アクション)。
            } 
            最後に
            { 
                場合(ドメイン!= NULL 
                    AppDomain.Unload(ドメイン)。
            } 
        } 

        プライベート クラスAppDomainDelegate:MarshalByRefObjectを
        { 
            公共 ボイドは実行(アクションアクション)
            { 
                アクション(); 
            } 

            公共 ボイドは <T>(Tパラメータ、アクション<T>を実行アクション)
            { 
                アクション(パラメータ)。
            }

            公共 Tは<T>(機能<T>実行アクション)
            { 
                戻りアクション()。
            } 

            パブリック <T、TResult>(TパラメータのFunc <T、TResult>実行TResult アクション)
            { 
                リターン・アクション(パラメータ)。
            } 
        } 
    }
プライベート 無効 Form1_Load(オブジェクト送信者、EventArgsのE)
        { 
            // 1.なしなし戻り値呼び出し参照、およびクロスドメインコールイベント 
            NewAppDomain.Execute(()=>  
            { 
                VARの MyTaskに= 新しい新MyTaskに()へ; 
                mytask.MyEvent + = 新新 EventHandler <MyTask.MyEventArgs> (mytask_IndexChanged); 
                mytask.DoWork(); 
            }); 

            // 2.呼参照のノーリターンがない
            VARの DT = DateTime.Now.ToStringは(); 
            NewAppDomain.Execute < ストリング >(DT、引数=> 
            { 
                Console.WriteLineを(引数)。
            }); 

            // 3.ませ基準値をリターンコールと
            VARの結果= NewAppDomain.Execute(()=> { リターン " HelloWorldの" ;}); 

            // 4.コール参照のリターンがあり持っている
            のvarパラメータ= 新しい新しいリスト< 文字列 > { " A "" B "" C " };
             VAR結果2 = NewAppDomain.Execute(パラメータ、引数=> { 戻り 文字列 .join(" | " 、引数を);});
        } 

        ボイドオブジェクトmytask_IndexChanged(送信者、MyTask.MyEventArgs E)
        { 
            ます。Debug.Print(" イベント:" + e.EventData.ToString())。
        }

 

おすすめ

転載: www.cnblogs.com/nanfei/p/11319549.html