微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# 跨应用程序域通讯

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)
                    AppDomain.Unload(domain);
            }
        }

        /// <summary>
        /// 有返回值的无参调用
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="action"></param>
        /// <returns></returns>
        public static T Execute<T>(Func<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);

                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> action)
            {
                return action(parameter);
            }
        }
    }
private void Form1_Load(object sender,EventArgs e)
        {
            //1.无参无返回值调用,兼跨域事件调用
            NewAppDomain.Execute(() => 
            {
                var mytask = new MyTask();
                mytask.MyEvent += new EventHandler<MyTask.MyEventArgs>(mytask_IndexChanged);
                mytask.DoWork();
            });

            //2.有参无返回值调用
            var dt = DateTime.Now.ToString();
            NewAppDomain.Execute<string>(dt,args =>
            {
                Console.WriteLine(args);
            });

            //3.无参有返回值调用
            var result = NewAppDomain.Execute(() => { return "helloworld"; });

            //4.有参有返回值调用
            var parameter = 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());
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐