c # cross-application domain communication

public class MyTask
    {
        public class MyEventArgs : EventArgs
        {
            public object EventData { get; private set; }

            public MyEventArgs(object eventData)
            {
                this.EventData = eventData;
            }
        }

        public event EventHandler<MyEventArgs> MyEvent;

        public void DoWork()
        {
            Console.WriteLine("Start");
            var i = 0;
            while (i++ < 10)
            {
                Thread.Sleep(1000);
                var temp = this.MyEvent;
                if (temp != null)
                    temp(this, new MyEventArgs("MyEvent(" + i.ToString() + ")"));
            }
            Console.WriteLine("End");
        }
    }

    public static class NewAppDomain
    {
        /// <summary>
        /// 无参调用
        /// </summary>
        /// <param name="action"></param>
        public static void Execute(Action action)
        {
            AppDomain domain = null;

            try
            {
                domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid());

                var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                    typeof(AppDomainDelegate).Assembly.FullName,
                    typeof(AppDomainDelegate).FullName);

                domainDelegate.Execute(action);
            }
            finally
            {
                if (domain != null)
                    AppDomain.Unload(domain);
            }
        }

        /// <summary>
        /// 有参调用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="parameter"></param>
        /// <param name="action"></param>
        public static void Execute<T>(T parameter, Action<T> action)
        {
            AppDomain domain = null;

            try
            {
                domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid());

                var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                    typeof(AppDomainDelegate).Assembly.FullName,
                    typeof(AppDomainDelegate).FullName);

                domainDelegate.Execute(parameter, action);
            }
            finally
            {
                if (domain != null)

         
         
         
         
         
         

            

                 domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                    typeof(AppDomainDelegate).Assembly.FullName,
                    typeof(AppDomainDelegate).FullName);

                return domainDelegate.Execute(action);
            }
            finally
            {
                if (domain != null)
                    AppDomain.Unload(domain);
            }
        }

        /// <summary>
        /// 有返回值的有参调用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="parameter"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static TResult Execute<T, TResult>(T parameter, Func<T, TResult> action)
        {
            AppDomain domain = null;

            try
            {
                domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid());

                var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
                    typeof(AppDomainDelegate).Assembly.FullName,
                    typeof(AppDomainDelegate).FullName);

                return domainDelegate.Execute(parameter, action);
            }
            finally
            {
                if (domain != null)
                    AppDomain.Unload(domain);
            }
        }

        private class AppDomainDelegate : MarshalByRefObject
        {
            public void Execute(Action action)
            {
                action();
            }

            public void Execute<T>(T parameter, Action<T> action)
            {
                action(parameter);
            }

            public T Execute<T>(Func<T> action)
            {
                return action();
            }

            public TResult Execute<T, TResult>(T parameter, Func<T, TResult> action)
            {
                return action(parameter);
            }
        }
    }
Private  void the Form1_Load ( Object SENDER, EventArgs E) 
        { 
            // 1. None None Return Value call reference, and cross-domain call event 
            NewAppDomain.Execute (() =>  
            { 
                var MyTask = new new to MyTask (); 
                mytask.MyEvent + = new new the EventHandler <MyTask.MyEventArgs> (mytask_IndexChanged); 
                mytask.DoWork (); 
            }); 

            // 2. there is no return of a call reference 
            var dt = DateTime.Now.ToString (); 
            NewAppDomain.Execute < String > (dt, args =>  
            {
                Console.WriteLine (args); 
            }); 

            // 3. There are no arguments to call the return value 
            var Result = NewAppDomain.Execute (() => { return  " HelloWorld " ;}); 

            // 4. There have return of a call reference 
            var Parameter = new new List < String > { " A " , " B " , " C " };
             var result2 = NewAppDomain.Execute (Parameter, args => { return  String .join ( " | " , args);});
        }

        void mytask_IndexChanged(object sender, MyTask.MyEventArgs e)
        {
            Debug.Print("Event:" + e.EventData.ToString());
        }

 

Guess you like

Origin www.cnblogs.com/nanfei/p/11319549.html