zoukankan      html  css  js  c++  java
  • 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());
            }
  • 相关阅读:
    文件隐藏在一张图片里
    晶振
    主宰全球的10大算法
    java+mysql连接的优化
    排序剔除
    js数据类型
    字符实体
    表单
    定义样式表
    布局相关的属性
  • 原文地址:https://www.cnblogs.com/nanfei/p/11319549.html
Copyright © 2011-2022 走看看