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>(T parameter, Func<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());
        }
复制代码

 

posted on   空明流光  阅读(837)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示