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()); }
桂棹兮兰桨,击空明兮溯流光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!