パブリック クラス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())。 }